Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows中的GetDesktopWindow和OpenInputDesktop API之间有什么区别?_Windows_Winapi - Fatal编程技术网

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

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,

Windows中的
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的应用程序,希望在用户切换桌面时“跟随用户”,但这不适用于安全的锁定桌面,因此这些类型的应用程序必须使用另一种方式来处理该案例。

正是我想要的详细信息。我很想知道他们之间的关系。谢谢你,伙计!