2012-02-10 93 views

回答

2

它們返回完全不同的值,所以它們不可互換。

GetDesktopWindow返回HWND,這是一個句柄窗口:

HWND WINAPI GetDesktopWindow(void); 

OpenInputDesktop返回一個HDESK,這是一個句柄,你可以通過在文檔中看着自己的函數簽名告訴桌面:

HDESK WINAPI OpenInputDesktop(
    __in DWORD dwFlags, 
    __in BOOL fInherit, 
    __in ACCESS_MASK dwDesiredAccess 
); 

因此,您使用哪一個顯然取決於您需要哪種類型的值。所有Desktop functions都需要HDESK類型的參數。所有窗口操作函數都需要處理窗口(HWND)。

所有這一切都說,如果我沒有提醒你不要濫用桌面窗口,那麼函數返回的結果就是我的疏忽。 The desktop window is very special.

16

至於他們做什麼:

GetDesktopWindow()返回「根」取其桌面調用線程當前關聯的HWND;也許更好的想法是「Get root HWND」。桌面上的所有其他窗口/ HWND s都是某種程度上的後代。頂層窗戶是直接的兒童。 (僅限消息窗口是一種特殊情況,它們不會顯示在HWND樹上,但仍屬於桌面。)請注意,這與使用所有文件和圖標的背景窗口不同就可以正確地稱爲「Shell Desktop」窗口,並且您可以使用GetShellWindow() - 它恰好是一種特殊類型的頂級窗口。

OpenInputDesktop()返回當前處於活動狀態並接收用戶輸入的任何桌面的HDESK。每個桌面根植於根窗口或「桌面」窗口中,具有自己的HWND樹。

至於這些如何相關,一旦你有一個HDESK,你可以使用SetThreadDesktop設置該桌面作爲線程的默認桌面;那麼調用GetDesktopWindow將返回該桌面的根HWND。 (請注意,首先必須具有使用該HDESK的權限,例如,如果輸入桌面是鎖定的桌面,則通常不會出現這種情況。)您還可以使用GetThreadDesktop()獲取當前線程的HDESK

您可以使用GetDesktopWindow()如果你想遍歷HWND樹爲您的應用程序在桌面上 - 間諜++ - 類型的應用程序可以使用它來獲取根窗口,並從那裏使用GetWindow()或相似的,或許是穿越。但是大多數應用程序都很樂意保留自己,所以不需要知道其他窗口在哪裏。也許一個常用的用途是檢查任意窗口是否爲頂層:使用GetAncestor(hwnd, GA_PARENT),並檢查返回值是否匹配GetDesktopWindow()

OpenInputDesktop()可能更少使用;大多數應用程序只是坐在桌面上,他們開始並呆在那裏。也許如果你編寫了一個桌面切換工具創建了多個用戶可以切換的桌面,那麼這個應用程序或其他應用程序可以使用它來確保它在當前顯示的UI上,但這並不是一個常見的場景在所有。在一個階段,可能有人可能會寫一些類似放大鏡或屏幕閱讀器或其他應用程序的用戶界面,他們希望在用戶切換桌面時「跟隨用戶」,但這不適用於安全的鎖定桌面,所以這些類型的應用程序必須使用另一種方式來處理這種情況。

+0

準確的細節我正在尋找。我很想知道他們是如何相互關聯的。多謝,夥計! – Quest 2012-02-10 07:59:18