2012-11-30 80 views
5

我用ShellExecute做什麼,第一參數是HWND,MSDN上的documentation說:HWND在ShellExecute中做什麼?

手柄可用於顯示用戶界面或錯誤消息的父窗口。如果操作不與窗口關聯,則此值可以爲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

通過調用'GetDesktopWindow()'方法可以獲得桌面窗口'HWND',並且該句柄不等於0。0表示空/非最小化句柄。 – teran

+0

@teran但是,如果ShellExecute被傳遞的窗口句柄等於0,則可能包含調用GetDesktopWindow的代碼。 –

回答

11

HWND被用作任何用戶界面的所有者窗口,該用戶窗口作爲對ShellExecute的調用結果顯示。例如,任何錯誤消息對話框都將由該窗口擁有。

所有窗口的含義在MSDN documentation中描述。主要摘錄:

被擁有的位置對窗口有幾個限制。

  • 一個擁有的窗口始終在z所有者的上方。
  • 系統在其擁有者被銷燬時自動銷燬擁有的窗口。
  • 擁有窗口在其所有者最小化時隱藏。

重要的是第一個。如果您從GUI應用程序調用ShellExecute,那麼您希望任何窗口都歸您應用程序當前活動的窗口所有。所以通過MyForm.Handle

如果你在你的應用程序沒有GUI,然後通過0

中的代碼示例,調用ShellExecute沒有顯示任何UI可言。所以你通過什麼並沒有什麼不同。但是,如果您的通話導致出現錯誤對話框,那麼您傳遞的窗口句柄將變得相關。