Windows中的GetDesktopWindow和OpenInputDesktop API之间有什么区别?
Windows中的Windows中的GetDesktopWindow和OpenInputDesktop API之间有什么区别?,windows,winapi,Windows,Winapi,Windows中的GetDesktopWindow和OpenInputDesktopAPI之间的用法有什么区别?它们返回完全不同的值,因此不能互换。您只需查看文档中的函数签名即可知道: 返回一个HWND,它是窗口的句柄: HWND WINAPI GetDesktopWindow(void); while返回一个HDESK,它是桌面的句柄: HDESK WINAPI OpenInputDesktop( __in DWORD dwFlags, __in BOOL fInherit,
GetDesktopWindow
和OpenInputDesktop
API之间的用法有什么区别?它们返回完全不同的值,因此不能互换。您只需查看文档中的函数签名即可知道:
返回一个HWND
,它是窗口的句柄:
HWND WINAPI GetDesktopWindow(void);
while返回一个HDESK
,它是桌面的句柄:
HDESK WINAPI OpenInputDesktop(
__in DWORD dwFlags,
__in BOOL fInherit,
__in ACCESS_MASK dwDesiredAccess
);
因此,您使用哪一种显然取决于您需要哪种类型的值。所有这些都需要类型为HDESK
的参数。所有窗口操作函数都需要窗口的句柄(HWND
)
所有这些都表明,如果我不提醒您不要滥用桌面窗口,我将是失职的,正如GetDesktopWindow
函数返回的那样 至于他们做什么:
GetDesktopWindow()
返回调用线程当前关联的任何桌面的“根”HWND
;最好将其理解为“获取根HWND
”。桌面上的所有其他窗口/HWND
s不知何故都是这个的后代。顶层窗口是直接子窗口。(仅限消息的窗口是一种特殊情况,它们不会显示在HWND树上,但仍然属于桌面。)请注意,这与背景中包含所有文件和图标的窗口不同,它可能被正确地称为“Shell desktop”窗口,你可以使用它,它恰好是一种特殊类型的顶级窗口
OpenInputDesktop()
返回当前处于活动状态并接收用户输入的桌面的HDESK
。每个桌面都有自己的HWND
s树,根在根窗口或“桌面”窗口
至于这些是如何关联的,一旦你有了HDESK,你可以使用SetThreadDesktop将该桌面设置为线程的默认桌面;然后调用GetDesktopWindow将返回该桌面的根HWND。(请注意,您首先必须拥有使用该HDESK的权限,例如,如果输入桌面是锁定的桌面,则通常不是这种情况。)您还可以使用GetThreadDesktop()
获取当前线程的HDESK
如果要遍历应用程序所在桌面的HWND
树,可以使用GetDesktopWindow()
,Spy++-类型的应用程序可能会使用它来获取根窗口,并使用GetWindow()
或类似方法从那里遍历。但大多数应用程序都乐于保持自己的独立性,因此不需要知道还有哪些其他窗口。可能有一种常见用法用于检查任意窗口是否为顶级:使用,并检查返回值是否匹配GetDesktopWindow()
OpenInputDesktop()
可能更很少使用;大多数应用程序只是放在桌面上启动,并保持在那里。也许如果您编写了一个桌面切换实用程序,它创建了多个用户可以在其中切换的桌面,那么该应用程序或其他一些应用程序可以在显示UI之前使用它来确保它位于当前桌面上,但这真的不是一个常见的场景。在某个阶段,可能会编写一些东西,比如放大镜、屏幕阅读器或其他带有UI的应用程序,希望在用户切换桌面时“跟随用户”,但这不适用于安全的锁定桌面,因此这些类型的应用程序必须使用另一种方式来处理该案例。正是我想要的详细信息。我很想知道他们之间的关系。谢谢你,伙计!