2

我有一个获取屏幕截图的 Windows 服务。但它只创建黑屏。我知道这是由于会话 0 隔离而发生的。我在互联网上搜索并找不到任何批准的解决方案来解决这个问题,任何可行的想法都会非常好。

1-有没有办法改变windows服务的会话并获得另一个用户会话的桌面屏幕,如会话1、会话2?

2-有没有办法启动一个控制台应用程序,该应用程序在 Windows 服务的会话 0 以外的另一个会话中运行?

4

2 回答 2

5

Windows 服务被设计为在没有用户连接时也运行,它的工作方式就像一个服务器进程总是启动并监听,或者启动并做某事,或者空闲。

我认为您需要的是一个客户端应用程序,它在每个登录用户的会话中运行并最终完成工作,然后,如果需要,与服务通信以完成一些工作。

我在这里说的是,您可以创建一个小的可执行文件(可能根本没有 UI),而不是让 Windows 服务在另一个会话中运行,而不是每个用户登录时从所有用户的启动文件夹启动。这样的应用程序然后在正确的会话中运行并可以访问它,它可以获取屏幕截图,然后将其存储在某个地方或在您的 Windows 服务中调用一些端点(始终在会话 0 中运行)并使服务详细说明屏幕截图取自它的客户端应用程序。

这就是我会这样做的方式,而不是尝试一些“魔术”来告诉 Vista 和 7 在系统启动时最终尚未登录的用户会话中启动服务。

于 2011-09-17T10:51:21.813 回答
2

有没有办法更改 Windows 服务的会话并获取另一个用户会话的桌面屏幕,如会话 1、会话 2?

不。

有没有办法从 Windows 服务启动在会话 0 以外的另一个会话中运行的控制台应用程序?

这可以做到,但它很混乱。它涉及模拟登录用户、操纵用户令牌以及使用CreateProcessAsUser(). 本文描述了需要什么。

顺便说一句,您不需要控制台应用程序,因为这会在您的屏幕截图上显示一个控制台窗口。您只需要一个标准的 Windows 应用程序(使用 GUI 子系统)但不显示任何可见窗口。

于 2011-09-17T10:55:20.353 回答