5

我们必须从 Windows 服务运行一个进程并从中获取屏幕截图。

我们尝试了 BitBlt 和 PrintWindow Win32 调用,但都给出了空白(黑色)位图。

如果我们从普通用户进程运行我们的代码,它就可以正常工作。

这甚至是可能的吗?或者有没有其他方法可以尝试?

我们尝试过的事情:

  1. Windows 服务作为本地系统运行,以本地系统运行进程 -> 屏幕截图失败
  2. 以管理员身份运行的 Windows 服务,以管理员身份运行进程 -> 屏幕截图失败。
  3. 以用户 XYZ 身份运行的 Windows 应用程序以 XYZ 身份运行进程 -> 屏幕截图适用于 BitBlt 或 PrintWindow。
  4. 尝试从本地系统检查“允许服务与桌面交互”

我们还注意到 PrintWindow 更适合我们的情况,如果窗口位于另一个窗口后面,它就可以工作。

对于其他要求,父进程和子进程必须在同一用户下。我们不能真正使用从一个进程到另一个进程的模拟。

4

4 回答 4

6

目前我找不到相应的链接,但问题是,Windows 服务在另一个会话中运行,而不是在普通用户应用程序中运行。

在 XP 中,这并不完全正确。以下是在 Session 0 中启动的所有服务,第一个登录系统的用户也将在 Session 0 中运行。因此,在这种情况下,允许服务与桌面交互等技巧工作。但是,如果您快速切换到另一个用户,他将获得 Session 1 并且没有机会直接与服务交互。如果您通过 RDP 连接到服务器版本(如 2003 或 2008),这也是如此。这些登录也将在高于 0 的会话中开始。

最后但同样重要的是,使用与桌面的交互还有另一个缺点:
如果启用此选项并且您的服务在(默认)SYSTEM 帐户下运行,它将无法再创建网络连接。

获得与服务一起使用的自定义 GUI 的正确方法是将它们分成两个进程并执行某种 IPC(进程间通信)。因此,服务将在机器启动时启动,并且 GUI 应用程序将在用户会话中启动。在这种情况下,GUI 可以创建一个屏幕截图,将其发送到服务,服务可以使用它来做任何你喜欢的事情。

于 2010-05-19T09:02:25.630 回答
4

您是否尝试在选中“允许服务与桌面交互”的情况下作为本地系统运行?

于 2009-09-18T17:15:18.653 回答
3

我不认为这是可能的。

我们必须改变我们的应用程序不是从服务启动的场景,而是一个标准的 Windows 程序,在角落里有一个 NotifyIcon。

如果有人仍然找到真正的答案,请告诉我。

于 2009-09-23T16:16:37.260 回答
-1

它使用本地系统和“允许服务与桌面交互”

您可以使用此示例代码以编程方式设置它:

http://www.vbforums.com/showthread.php?t=367177(它是 vb.net 但很简单)

于 2010-05-19T08:04:04.663 回答