我使用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使用时?
答案 0 :(得分:12)
HWND
用作任何显示为ShellExecute
调用结果的用户界面的所有者窗口。例如,任何错误消息对话框都将由该窗口拥有。
MSDN documentation中描述了所拥有窗口的含义。主要摘录:
拥有会在窗口上放置几个约束。
- 拥有的窗口始终位于z订单的所有者之上。
- 系统会在其所有者被销毁时自动销毁拥有的窗口。
- 拥有的窗口在其所有者最小化时隐藏。
重要的是第一个。如果您从GUI应用程序调用{{1}},那么您希望任何窗口归应用程序中当前活动的窗口所有。所以通过ShellExecute
。
如果您的应用中没有GUI,则传递0。
在代码示例中,对MyForm.Handle
的调用根本没有显示任何UI。所以你传递的没有任何区别。但是,如果您的调用导致显示错误对话框,那么您传递的窗口句柄将变得相关。