捕获虚拟屏幕(所有监视器)

时间:2011-03-31 12:55:43

标签: c# virtual screenshot

我正在尝试获取整个虚拟屏幕的屏幕截图。这意味着,不仅是主屏幕,还有连接到计算机的每个屏幕的图像。

有办法吗?我尝试使用它,但它不起作用:

Bitmap b = new Bitmap(SystemInformation.VirtualScreen.Width, SystemInformation.VirtualScreen.Height);
Graphics g = Graphics.FromImage(b);
this.Size = new Size(SystemInformation.VirtualScreen.Width, SystemInformation.VirtualScreen.Height);
g.CopyFromScreen(0, 0, 0, 0, b.Size);

3 个答案:

答案 0 :(得分:6)

documentation说:Graphics.CopyFromScreen(Int32, Int32, Int32, Int32, Size):执行从屏幕到绘图表面的颜色数据的位块传输,对应于矩形像素图形。“但虚拟屏幕不一定是矩形:想象两个显示器具有1920x1200和1280x1024分辨率。所以你需要做的是像你一样创建一个位图,然后枚举你的监视器并为每个执行CopyFromScreen()他们。

编辑:例如,如果您有两台显示器,分辨率为1280x1024的显示器位于1920x1200的左侧之一,则前者的坐标为(-1280,0) - (0,1024)。因此,您需要执行memoryGraphics.CopyFromScreen(-1280, 0, 0, 0, s);,其中s是Size(1280,1024)。对于第二个,您需要致电memoryGraphics.CopyFromScreen(0, 0, *1280*, 0, s);,而s将是Size(1920, 1200)。 希望这会有所帮助。

答案 1 :(得分:2)

Igor是对的,传递0,0为SourceX / Y参数不正确。迭代Screen.AllScreens属性中的Screen实例以查找边界矩形。请注意CopyFromScreen()有错误,它无法捕获分层窗口(具有TransparencyKeyOpacity设置的类型)。在this thread中查看我的答案以获得解决方法。

请注意捕获整个桌面并不总是实用的,当屏幕没有排列在一个完美的矩形中时,你会得到很多黑色,并且在32位机器上OutOfMemory异常并不少见高分辨率显示器。

答案 2 :(得分:2)

就像伊戈尔和汉斯所说,你必须指出源坐标:

Bitmap screenshot = new Bitmap(
    SystemInformation.VirtualScreen.Width, 
    SystemInformation.VirtualScreen.Height, 
    PixelFormat.Format32bppArgb);

Graphics screenGraph = Graphics.FromImage(screenshot);

screenGraph.CopyFromScreen(
    SystemInformation.VirtualScreen.X, 
    SystemInformation.VirtualScreen.Y, 
    0, 
    0, 
    SystemInformation.VirtualScreen.Size, 
    CopyPixelOperation.SourceCopy);