如何在.NET中从Web应用程序中捕获屏幕截图?

8

在Java中,我们可以按照以下方式实现:

import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.io.File;

...

public void captureScreen(String fileName) throws Exception {

   Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
   Rectangle screenRectangle = new Rectangle(screenSize);
   Robot robot = new Robot();
   BufferedImage image = robot.createScreenCapture(screenRectangle);
   ImageIO.write(image, "png", new File(fileName));

}

...

如何在.NET Web应用程序中实现从客户端捕获屏幕并将其发送到服务器的操作?


为了澄清,我希望从一个ASP.NET MVC应用程序中实现这个。 - Srikar Doddi
@CodeToGlory 你想复制客户端的屏幕吗?这在网页应用程序中是不可能的。你需要在客户端上运行代码。 - Dave Swersky
无法从ASP.NET实现。唯一可能的方法是创建一个ActiveX控件,但即使使用这样的解决方案,它也只能适用于IE用户。重新考虑您最终想要做什么。 - Icemanind
@CodeToGlory:你确定这段Java代码能在网络应用程序中工作吗?我无法想象,因为代码是在服务器端运行的,对吧?或者你是从Java小程序中运行它的吗? - Lars Truijens
@CodeToGlory:为什么这不会成为一个巨大的安全漏洞?如果您能够捕获客户端的屏幕,那么为什么其他页面不能做同样的事情呢?这样的页面可以制作一个视频,准确地展示用户如何使用他的计算机。 - John Saunders
显示剩余3条评论
4个回答

6

.NET图形对象有一个名为CopyFromScreen()的方法,它可以捕获屏幕上的矩形区域并将其复制到位图中。最好的方法类似于以下内容:

public void CaptureImage(Point SourcePoint, Point DestinationPoint, Rectangle Selection, string FilePath)
{
    using (Bitmap bitmap = new Bitmap(Selection.Width, Selection.Height)) {
        using (Graphics g = Graphics.FromImage(bitmap)) {
            g.CopyFromScreen(SourcePoint,DestinationPoint, Selection.Size);
        }
        bitmap.Save(FilePath, ImageFormat.Bmp);
    }
}

真的,但现在我们知道这必须从Web应用程序中完成,仅凭此代码是不够的答案。 - Lars Truijens
是的。如果他想捕获客户端的桌面屏幕,那么从ASP.NET中无法实现。也许可以使用ActiveX,但它只能在IE Windows用户上运行。 - Icemanind
2
使用Silverlight 3.0及以上版本,有一个名为WriteableBitmap的对象可以让您仅捕获浏览器的客户端区域。您无法捕获整个屏幕...只能捕获silverlight插件占用的屏幕区域。 您可以从此处获取示例:https://dev59.com/6EzSa4cB1Zd3GeqPoanx - Icemanind
具体来说,它将把 Silverlight 应用程序绘制到位图上。 - Lasse V. Karlsen
2
首先,我认为这是因为它不做你想要的事情。Java Robot对象只捕获客户端区域,而不是用户的整个桌面屏幕。其次,你不能将Java与ASP.NET进行比较。它们是两个不同的东西。Java是从网页加载并在客户端机器上运行的小应用程序。而ASP.NET则不在客户端机器上运行,它严格地在Web服务器上运行。Java小应用程序更类似于Adobe Flash或Microsoft Silverlight。 - Icemanind
显示剩余2条评论

4
不,使用仅限于HTML或JavaScript是无法完成此操作的。它们没有能力进行此操作。一个可能的原因是像John Saunders所指出的那样,这将是一种安全风险。Web应用程序可以捕获发生在用户屏幕上的任何事情,而用户却不知道。
像您展示的服务器端代码无法工作,因为它在服务器端运行。Silverlight或ActiveX表单可能会起作用,但没有选项,因为您希望它在所有浏览器和所有平台上都能够工作。
编辑
icemanind让我们知道,在Silverlight中可能是可以做到的,但不能捕获整个屏幕。可能是出于安全原因。

1

实际上,在我的回答之后添加了代码必须仅用于Web应用程序的要求...所以感谢您的投票否决。 - Paya

1

基本的Web应用程序和Silverlight都无法实现这一点。

我也非常怀疑Java中的Robot类在作为浏览器小程序运行时是否允许您截取屏幕截图,否则,如果一个基本的Web应用程序带有一个像素大小的Java小程序可以将我的桌面实时视频流传输到服务器上,那将是Java发现的最大安全漏洞之一。

让我们退一步,问一下:你想要实现什么?你为什么想要截屏?


用户抱怨一个问题,但我无论在QA还是任何环境中都无法复制。这并不意味着它没有发生,因此我们希望亲眼看到它。 - Srikar Doddi
@CodeToGlory:也许最好提出一个新问题,询问如何捕获用户的操作以进行调试。屏幕截图程序或桌面共享应用程序是不错的选择。 - Lars Truijens

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