HWND在ShellExecute中做了什么?

时间:2012-11-30 09:22:52

标签: delphi

我使用ShellExecute做某事,第一个参数是HWND,MSDN上的documentation说:

  

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

但我发现任何HWND值都会得到相同的结果。

例如:

ShellExecute(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'是DeskTop的Handle使用时?

1 个答案:

答案 0 :(得分:12)

HWND用作任何显示为ShellExecute调用结果的用户界面的所有者窗口。例如,任何错误消息对话框都将由该窗口拥有。

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

  

拥有会在窗口上放置几个约束。

     
      
  • 拥有的窗口始终位于z订单的所有者之上。
  •   
  • 系统会在其所有者被销毁时自动销毁拥有的窗口。
  •   
  • 拥有的窗口在其所有者最小化时隐藏。
  •   

重要的是第一个。如果您从GUI应用程序调用{​​{1}},那么您希望任何窗口归应用程序中当前活动的窗口所有。所以通过ShellExecute

如果您的应用中没有GUI,则传递0。

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