【问题标题】:Screen capture from windows service来自 Windows 服务的屏幕截图
【发布时间】:2010-11-03 09:02:14
【问题描述】:

我有基于 DirectShow 的屏幕捕捉软件。它在内部调用 CopyScreenToBitmap 函数来抓取屏幕。然后图片被ffdshow压缩。 它作为桌面应用程序运行良好,但作为窗口服务,在某些计算机上它不起作用(黑色图片)。我已设置“允许服务与桌面交互”并在当前用户帐户上运行该服务。 有什么想法可能是错的吗?

我在 Windows XP 上对其进行了测试,但预计它也可以在 Vista 和 7 上运行。

是的,它在所有计算机上都可以作为桌面应用程序运行,但在其中一些(大多数)计算机上,它作为服务失败。

【问题讨论】:

  • 您的服务无法正常运行的计算机上正在运行哪些操作系统?
  • @bezieur:“预计会奏效”!=“会奏效”,甚至“有可能会奏效”。你不应该用“它应该工作”来操作,你应该测试它。 Win32 服务模型在 Vista 及更高版本中发生了显着变化。
  • @Mihai:当然,你是对的!我的意思是它现在必须在 XP 上运行,但在未来(很短的一个)要求将是在更新的 ms os 系统上运行:-)。
  • @bezieur:现在的化身更好,谢谢:)
  • 来自stackoverflow.com/questions/1832384/…,看来Vista不允许“服务与桌面交互”

标签: c# c++ windows-services screen-capture


【解决方案1】:

据我了解,Vista 中进行了一项更改,将服务从控制台用户移到了单独的桌面上。虽然您已勾选“允许访问”桌面的框,但我认为您仍然必须务实地切换服务以使用该桌面。

Here is a blog post with some useful info and examples.

【讨论】:

  • 这也是一个很好的答案,但它太短了,无法帮助我跨越知识鸿沟:-)。
【解决方案2】:

除了允许访问桌面之外,试试这个:

  1. 枚举所有窗口站:EnumWindowStations
  2. 找到登录用户的窗口站,并将其设为您的进程的窗口站:SetProcessWindowStation - 参见示例in this thread
  3. 然后将你当前线程的桌面设置为窗口站的默认桌面also here
  4. 然后使用以下几种方法之一获取桌面的 DC,包括

    CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL)

    祝你好运

【讨论】:

猜你喜欢
  • 2014-10-25
  • 2023-03-19
  • 1970-01-01
  • 2011-11-19
  • 2021-03-20
  • 1970-01-01
  • 2013-08-20
  • 1970-01-01
  • 2011-02-17
相关资源
最近更新 更多