Windows中的GetDesktopWindow和OpenInputDesktop API有什么区别?

Windows中的GetDesktopWindowOpenInputDesktop API之间的用法区别是什么?

Solutions Collecting From Web of "Windows中的GetDesktopWindow和OpenInputDesktop API有什么区别?"

至于他们做什么:

GetDesktopWindow()返回调用线程当前关联的桌面的“根” HWND ; 也许更好的想法是“获取root HWND ”。 桌面上的所有其他窗口/ HWND s都是某种程度上的后代。 顶层窗户是直接的孩子。 (只有消息窗口是一种特殊情况,它们不会显示在HWND树上,但仍属于桌面。)请注意,这不同于所有文件和图标在后台的窗口就可以正确地称为“Shell Desktop”窗口,并且可以使用GetShellWindow() – 它恰好是一种特殊类型的顶层窗口。

OpenInputDesktop()返回当前处于活动状态的桌面的HDESK并接收用户输入。 每个桌面都有自己的HWND树,根植于根窗口或“桌面”窗口。

至于这些如何相关,一旦你有一个HDESK,你可以使用SetThreadDesktop设置该桌面作为线程的默认桌面; 那么调用GetDesktopWindow将返回该桌面的根HWND。 (请注意,首先必须具有使用该HDESK的权限,例如,如果输入桌面是锁定的桌面,则通常不会出现这种情况。)还可以使用GetThreadDesktop()获取当前的HDESK线。

如果您想遍历应用程序所在桌面的HWND树,您可以使用GetDesktopWindow() .Spy ++类型的应用程序可能会使用它来获取根窗口,并可能使用GetWindow()或类似的方法从那里遍历。 但大多数应用程序都很乐意保持自己,所以不需要知道其他窗口在那里。 也许一个常见的用途是检查一个任意窗口是否为顶层:使用GetAncestor(hwnd, GA_PARENT) ,并检查返回值是否与GetDesktopWindow()匹配。

OpenInputDesktop()可能更少使用; 大多数应用程序只是坐在桌面上,他们开始,留在那里。 也许如果你编写了一个桌面切换工具来创建多个用户可以切换的桌面,那么这个应用程序或其他应用程序可以使用它来确保在显示UI之前它在当前的那个桌面上,但是这不是一个常见的情况在所有。 在一个阶段,可能已经有可能写一些类似放大镜或屏幕阅读器或其他应用程序的用户界面,他们想要“跟随用户”,因为他们切换桌面,但这不适用于锁定桌面这是安全的 – 所以这些类型的应用程序必须使用另一种方式来处理这种情况。

它们返回完全不同的值,所以它们不能互换。 您可以通过查看文档中的函数签名来判断:

GetDesktopWindow返回一个HWND ,它是一个窗口句柄:

 HWND WINAPI GetDesktopWindow(void); 

OpenInputDesktop返回一个HDESK ,这是一个桌面的句柄:

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

因此,你使用哪一个显然取决于你需要哪种类型的值。 所有桌面功能都需要HDESK类型的参数。 所有的窗口操作函数都需要处理窗口( HWND )。

所有这些说,如果我不提醒你滥用GetDesktopWindow函数返回的桌面窗口,我将会失去工作。 桌面窗口非常特殊。