Delphi HWND在ShellExecute中做什么?

Delphi HWND在ShellExecute中做什么?,delphi,Delphi,我使用ShellExecute来做一些事情,第一个参数是HWND,MSDN上的说明是: 父窗口的句柄,用于显示UI或错误消息。如果操作未与窗口关联,则此值可以为NULL 但是我发现无论哪个HWND值都会得到相同的结果 例如: shell执行(0,'open','c:\',nil,nil,SW_SHOWNORMAL) ShellExecute(Self.Handle,'open',c:\',nil,nil,SW_SHOWNORMAL) ShellExecute(123456,'open','c:\

我使用
ShellExecute
来做一些事情,第一个参数是
HWND
,MSDN上的说明是:

父窗口的句柄,用于显示UI或错误消息。如果操作未与窗口关联,则此值可以为NULL

但是我发现无论哪个
HWND
值都会得到相同的结果

例如:

shell执行(0,'open','c:\',nil,nil,SW_SHOWNORMAL)

ShellExecute(Self.Handle,'open',c:\',nil,nil,SW_SHOWNORMAL)

ShellExecute(123456,'open','c:\',nil,nil,SW_SHOWNORMAL)

只是得到了同样的东西(打开磁盘C),所以我想知道使用不同的
HWND
有什么用


顺便说一下,当“HWND=0”是桌面的句柄时?

调用
ShellExecute
后显示的任何UI的所有者窗口都将使用
HWND
。例如,任何错误消息对话框都将属于该窗口

中描述了拥有窗口的含义。主要摘录:

被拥有会在窗口上放置多个约束

  • 拥有的窗口在z顺序中始终高于其所有者
  • 当所有者被销毁时,系统会自动销毁其拥有的窗口
  • 当所有者最小化时,拥有的窗口将隐藏
重要的是第一个。如果您从GUI应用程序调用
ShellExecute
,则您希望应用程序中当前活动的窗口拥有任何窗口。所以传递
MyForm.Handle

如果应用程序中没有GUI,则传递0


在代码示例中,对
ShellExecute
的调用根本没有显示任何UI。所以你通过什么都没关系。但是,如果您的调用导致显示错误对话框,那么您传递的窗口句柄将变得相关。

您可以通过调用
GetDesktopWindow()
方法来获得桌面窗口
HWND
,而此句柄不等于0。0表示空的/未初始化的句柄。@teran但如果传递的窗口句柄等于0,ShellExecute可能包含调用
GetDesktopWindow
的代码。