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

Que*_*est 9 windows winapi

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

Bre*_*McK 17

至于他们做了什么:

GetDesktopWindow()返回HWND调用线程当前关联的桌面的"根" ; 它可能更好地被认为是"获得根HWND".HWND桌面上的所有其他窗口都是这个的后代.顶级窗户是直接儿童.(仅消息窗口是一种特殊情况,它们不会显示在HWND树上,但仍属于桌面.)请注意,这与所有文件和图标在后台的窗口不同在它上面,这可能恰当地称为"Shell桌面"窗口,你可以使用GetShellWindow()它 - 它恰好是一种特殊类型的顶级窗口.

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

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

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

OpenInputDesktop()可能更少使用; 大多数应用只是坐在他们开始的桌面上并留在那里.也许如果您编写了一个桌面切换实用程序来创建用户可以在其间切换的多个桌面,那么该应用程序或其他应用程序可以使用它来确保它在当前的那个之前显示UI,但这实际上不是常见的情况一点都不 在一个阶段可能有可能写一些类似放大镜或屏幕阅读器或其他具有UI的应用程序,这些应用程序在切换桌面时会"跟随用户",但这对于安全的锁定桌面不起作用 - 所以这些类型的应用程序必须使用另一种方式来处理该情况.


Cod*_*ray 3

它们返回完全不同的值,因此它们不可互换。您只需查看文档中的函数签名就可以知道:

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

HWND WINAPI GetDesktopWindow(void);
Run Code Online (Sandbox Code Playgroud)

whileOpenInputDesktop返回一个HDESK,它是桌面的句柄:

HDESK WINAPI OpenInputDesktop(
  __in  DWORD dwFlags,
  __in  BOOL fInherit,
  __in  ACCESS_MASK dwDesiredAccess
);
Run Code Online (Sandbox Code Playgroud)

因此,您使用哪一种显然取决于您需要哪种类型的值。所有Desktop 函数都需要 类型的参数HDESK。所有窗口操作函数都需要窗口句柄 ( HWND)。

综上所述,如果我没有警告您不要滥用函数返回的桌面窗口,那就是我的失职GetDesktopWindow桌面窗口很特别。