Windows中GetDesktopWindow
和OpenInputDesktop
API之间的用法区别是什么?
最佳答案
关于他们的工作:GetDesktopWindow()
返回调用线程当前与之关联的任何桌面的“root” HWND
;最好将其视为“获取root HWND
”。桌面上的所有其他Windows/HWND
都是这种方式的后代。顶层窗口是直接子级。 (仅消息窗口是一种特殊情况,它们不会显示在HWND树上,但仍属于桌面。)请注意,这与所有文件和图标位于背景的窗口不同在它上面,它可能被适本地称为“Shell Desktop”窗口,您可以使用 GetShellWindow()
获得它-它恰好是顶层窗口的一种特殊类型。OpenInputDesktop()
返回当前处于事件状态并接收用户输入的任何桌面的HDESK
。每个桌面都有自己的HWND
树,其根植于根窗口或“桌面”窗口。
关于它们之间的关系,一旦有了HDESK,就可以使用SetThreadDesktop将该桌面设置为该线程的默认桌面。然后调用GetDesktopWindow将返回该桌面的根HWND。 (请注意,首先必须具有使用该HDESK的权限,例如,如果输入桌面是锁定桌面,通常就不会使用该HDESK。)您还可以使用GetThreadDesktop()
获取当前线程的HDESK
。
如果要遍历应用程序所在桌面的GetDesktopWindow()
树,则可以使用HWND
-Spy++类型的应用程序可以使用它来获取根窗口并使用GetWindow()
或类似方法从那里遍历。但是大多数应用程序都乐于保留自己的位置,因此无需知道其他哪些窗口。也许一种常见的用法是检查任意窗口是否处于顶层:使用 GetAncestor(hwnd, GA_PARENT)
,并检查返回值是否匹配GetDesktopWindow()
。OpenInputDesktop()
甚至可能很少使用。大多数应用程序仅位于启动它们的桌面上并停留在该桌面上。也许,如果您编写了一个桌面切换实用程序来创建用户可以在其间切换的多个桌面,那么该应用程序或其他应用程序可以使用它来确保它在当前的桌面上显示,然后在此处显示UI,但这确实不是一种常见的情况。完全没有。在某个阶段,可能有可能使用放大镜或屏幕阅读器或其他具有UI的应用程序编写一些内容,这些内容在切换桌面时希望“跟随用户”,但不适用于安全的锁定桌面-因此,这些类型的应用必须使用其他方式来处理这种情况。
关于windows - Windows中的GetDesktopWindow和OpenInputDesktop API有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9222451/