Windows服务下的进程截图

时间:2009-09-18 17:10:48

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

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

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

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

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

我们尝试的事情:

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

    我们还注意到PrintWindow对我们的情况更有效,如果窗口在另一个窗口后面,它就可以工作。

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

4 个答案:

答案 0 :(得分:6)

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

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

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

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

答案 1 :(得分:3)

您是否尝试使用“允许服务与桌面交互”选中本地系统?

答案 2 :(得分:3)

我认为这不可能。

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

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

答案 3 :(得分:-1)

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

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

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