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

时间:2012-02-10 03:51:40

标签: windows winapi

Windows中的GetDesktopWindowOpenInputDesktop API之间的用法差异是什么?

2 个答案:

答案 0 :(得分:16)

关于他们做了什么:

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

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

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

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

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

答案 1 :(得分:2)

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

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

HWND WINAPI GetDesktopWindow(void);

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

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

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

所有这些都说,如果我没有提醒您不要滥用桌面窗口,我将会失职,正如GetDesktopWindow函数所返回的那样。 The desktop window is very special.