来自Windows服务的屏幕截图

4
我有一个基于DirectShow的屏幕捕获软件。它内部调用CopyScreenToBitmap函数来抓取屏幕。然后使用ffdshow对图片进行压缩。作为桌面应用程序,它运行良好,但是作为窗口服务,在某些计算机上无法正常工作(黑屏)。我已经设置了“允许服务与桌面交互”,并在当前用户帐户下运行该服务。您有什么想法可能出了什么问题?
我在Windows XP上测试过,但预计在Vista和7上也能正常工作。
是的,它在所有计算机上都可以作为桌面应用程序运行,但在一些计算机上(大多数情况下)作为服务时会失败。

你的服务无法正常运行的计算机上运行的操作系统是什么? - Mihai Limbășan
@bezieur:“预计能工作”不等于“一定能工作”,甚至不等于“有可能工作”。你不应该只是依赖“预计能工作”,而应该进行测试。Win32服务模型在Vista及以上版本中发生了重大变化。 - Mihai Limbășan
@Mihai:当然,你是对的!我只是想说目前它必须在XP上运行,但在不久的将来,要求将是在更新的微软操作系统上运行 :-)。 - Roman Motyka
@bezieur:目前的表述方式好多了,谢谢 :) - Mihai Limbășan
从https://dev59.com/IUrSa4cB1Zd3GeqPX5wR可以看出,Vista不允许服务与桌面交互。 - rogerdpack
请参见:https://dev59.com/7W435IYBdhLWcg3w0TdP#12851218 - Theraot
2个回答

4
据我理解,Vista进行了更改,将服务移动到了与控制台用户不同的独立桌面上。虽然您已经勾选了“允许访问”桌面的选项,但我认为您仍然需要实际操作将您的服务切换到该桌面上。
这里有一篇博客文章提供了一些有用的信息和示例。 (点击此处查看)

这也是一个很好的答案,但它太短了,无法帮助我跨越我的知识鸿沟 :-). - Roman Motyka

4

除了允许访问桌面外,还可以尝试以下操作:

  1. 枚举所有窗口站:EnumWindowStations
  2. 查找已登录用户的窗口站,并将其设置为您的进程的窗口站:SetProcessWindowStation - 可参考此线程中的示例
  3. 然后将当前线程的桌面设置为窗口站的默认桌面:这里也有
  4. 之后使用几种方法之一获取桌面的DC,包括:

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

    祝好运


这就是关键!感谢大家的帮助。此外,我还找到了一篇文章:http://www.codeproject.com/KB/system/SystemTrayIconInSvc.aspx,它也涵盖了这个问题。 - Roman Motyka
我正在将其用于我的网站Teen Patti Game,效果非常好。谢谢! - Manisha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接