我怎么枚举另一个用户会话的打开窗口(〜EnumWindows)

我有一个应用程序可以列出当前会话打开的窗口。 它使用user32.dll中的EnumWindows方法。

我想从Windows服务运行此代码,但由于该服务没有附加到用户会话,它不会显式返回。

所以问题是,我如何枚举另一个用户会话(例如与特定的login用户)打开的窗口?

与EnumWindows类似,我也想获得用户会话的前景窗口(就像GetForegroundWindow为当前用户工作)。

Solutions Collecting From Web of "我怎么枚举另一个用户会话的打开窗口(〜EnumWindows)"

据我所知,你不能访问另一个会话的窗口。 另外值得一提的是,目前还没有“当前会话” – 可能有多个用户通过终端服务登录,或者XP的用户快速切换。

一种方法是将一个程序添加到每个用户的配置文件中,而不需要与您的服务进行通信的用户界面。 尽管如此,您仍然需要应对可能有多个活动会话的事实。

根据此文档,您可以使用CreateProcessAsUser在其他用户的登录会话中创建一个进程,并可以在其中枚举窗口。 您仍然需要一些IPC机制来与服务进行通信。

接受的答案是不正确的。

所以问题是,我如何枚举另一个用户会话打开的窗口?

如果您作为以本地系统帐户运行的服务运行,则可以枚举任何会话的打开窗口。

首先要枚举与WTSEnumerateSessions的会话。 然后用EnumWindowStations枚举每个会话中的窗口工作站。 然后使用EnumDesktops枚举每个Window Station的桌面。 最后你枚举EnumWindows的那些桌面中的Windows。

(例如,使用特定的登录用户)

通过终端服务可以有许多并发的登录用户或快速用户切换。

与EnumWindows类似,我也想获得用户会话的前景窗口(就像GetForegroundWindow为当前用户工作)。

这可以通过在Session,Window Station和Desktop中启动带有找到的用户令牌的应用程序来完成。 从那里你可以调用像GetForegroundWindow的任何Win32 API,并将信息报告给你的父进程。

您可以了解有关会话,窗口站点和桌面在这里工作的更多信息 。