【问题标题】:Screenshot of process under Windows ServiceWindows服务下进程截图
【发布时间】:2010-11-29 13:38:47
【问题描述】:

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

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

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

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

我们尝试过的事情:

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

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

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

【问题讨论】:

  • 您是否尝试过允许服务与桌面交互?
  • 非常好的主意,但也没有奏效。我还认为,当我以管理员用户身份运行它时,就相当于这样做了。您不能作为用户并从管理控制台中选中“允许服务与桌面交互”——它已被禁用。
  • 我们能够解决这个问题。看一下示例代码:stackoverflow.com/a/45095509/125406

标签: c# .net windows-services process screenshot


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • +1 - 如果可行,这是个好主意。这当然是我能想到的唯一解决方案。
    【解决方案3】:

    我认为这是不可能的。

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

      • 这仅适用于 XP。在 Vista 或 7 上不行。在 XP 上它有两个缺点: 1. 如果启用此功能,您可能会因为在服务中创建网络连接而遇到问题。 2. 它只会显示在第一个登录用户的桌面上。如果你快速切换到第二个用户,你也不会看到任何东西。
      • Ad.1 网络连接?通过截图? Ad.2 是的,你是对的,由于 Session 0 隔离,它在 Vista/7 中不起作用
      猜你喜欢
      • 1970-01-01
      • 2010-11-03
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 2013-03-02
      • 1970-01-01
      • 1970-01-01
      • 2016-11-19
      相关资源
      最近更新 更多