如何从后台进程中截取屏幕截图?

3
我想建立一个系统,使得局域网上任何登录的用户都可以看到本地网络上其他机器屏幕上的内容。这是对所有用户的同意下的对等监控计划的一部分。
所有机器都运行Windows 7或10。理想情况下,我希望使用iPad的人也能看到屏幕。
我的最初想法是在每台机器上安装IIS,并拥有一个网站来捕获屏幕并在请求时返回。这样,在另一台机器上的用户只需浏览http://machinename/即可查看截屏。这将适用于桌面机和iPad。
然而,我发现你不能以这种方式访问屏幕,所以这个想法不行。同样,似乎Windows服务也无法访问屏幕。
我有哪些选项?我希望安装一次,适用于所有用户,并显示连接到该机器的屏幕上的内容。

@Psi 有什么建议吗?还有其他人吗?我已经搜索了很久,但找不到任何不依赖于Graphics.FromImage()的东西,当在后台运行时(例如在MVC控制器方法或Windows服务中)会抛出异常。 - DreamingOfSleep
在谷歌上搜索“Windows屏幕捕获”,你会找到很多例子。也许可以搜索一下“marshalling c#”。而使用IIS来实现这个目的就像用微波炉给大象刷油漆一样奇怪。使用c#可以编写桌面应用程序。不过,也许你会发现VNC很方便。 - Psi
@Psi 我觉得你误解了我的意思。我知道如何在C#中捕获屏幕。我也知道如何使用marshal C#,但不明白它与我的问题有什么关系。至于IIS,我知道它有点过头了,但如果你能建议一个更简单的方法来满足我的要求,请告诉我。请注意,桌面应用程序不适合,因为这需要安装一次,每台机器都可以运行所有用户,而不是我必须为每个用户设置的东西。它还必须能够在用户不知情的情况下被调用。这就是为什么我想到了IIS或后台进程。VNC和IIS一样过头,并且更具侵入性。 - DreamingOfSleep
服务无法捕获屏幕的主要问题在于它们没有附加到任何窗口会话。您需要与nt会话管理器交互,因为简单的问题是:您想要捕获谁的屏幕?可能会同时运行多个会话,仅因为现在只有一个会话并不意味着2分钟后就不会有更多会话。您需要附加到一个会话(例如控制台前台会话)。 - Psi
这正是我所期望的。团队花费数月甚至数年时间来使这种服务运作。不要指望它能在几天内完成。 - Psi
显示剩余7条评论
1个回答

1
像很多类似的问题一样,一个简单的解决方案只需要一些关于Windows会话隔离如何工作的基本理解,这些详细内容在像这样的帖子中有介绍。
由于您想要捕获屏幕截图,因此您的代码必须在同一个用户会话中运行。然后,您从搜索引擎找到的任何示例代码都将完美地运行。
许多现有的屏幕捕获解决方案都是建立在这种简单方法之上的,并且通常具有Windows托盘应用程序,该应用程序在用户登录时启动,并通过调用捕获API来准备屏幕截图。
引用一段话:
您无法使用Windows服务或在IIS上运行的Web应用程序来调用捕获API,因为它们运行在会话0中,而不是用户会话中。
在幕后,还有其他必要的组件来将屏幕截图分派到集中的后端服务器(以便然后将其发送到监视设备)。
引用一段话:
请注意,在这部分可以使用多种方法/架构,因此我不会分享太多以限制您的想象力。

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