我有一个应用程序可以列出当前会话打开的窗口。 它使用user32.dll中的EnumWindows方法。
我想从Windows服务运行此代码,但由于该服务没有附加到用户会话,它不会显式返回。
所以问题是,我如何枚举另一个用户会话(例如与特定的login用户)打开的窗口?
与EnumWindows类似,我也想获得用户会话的前景窗口(就像GetForegroundWindow为当前用户工作)。
据我所知,你不能访问另一个会话的窗口。 另外值得一提的是,目前还没有“当前会话” – 可能有多个用户通过终端服务登录,或者XP的用户快速切换。
一种方法是将一个程序添加到每个用户的配置文件中,而不需要与您的服务进行通信的用户界面。 尽管如此,您仍然需要应对可能有多个活动会话的事实。
根据此文档,您可以使用CreateProcessAsUser在其他用户的登录会话中创建一个进程,并可以在其中枚举窗口。 您仍然需要一些IPC机制来与服务进行通信。
接受的答案是不正确的。
所以问题是,我如何枚举另一个用户会话打开的窗口?
如果您作为以本地系统帐户运行的服务运行,则可以枚举任何会话的打开窗口。
首先要枚举与WTSEnumerateSessions的会话。 然后用EnumWindowStations枚举每个会话中的窗口工作站。 然后使用EnumDesktops枚举每个Window Station的桌面。 最后你枚举EnumWindows的那些桌面中的Windows。
(例如,使用特定的登录用户)
通过终端服务可以有许多并发的登录用户或快速用户切换。
与EnumWindows类似,我也想获得用户会话的前景窗口(就像GetForegroundWindow为当前用户工作)。
这可以通过在Session,Window Station和Desktop中启动带有找到的用户令牌的应用程序来完成。 从那里你可以调用像GetForegroundWindow的任何Win32 API,并将信息报告给你的父进程。
您可以了解有关会话,窗口站点和桌面在这里工作的更多信息 。