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

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

有没有办法做到这一点? 我尝试使用它,但它不起作用:

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); 

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

编辑:例如,如果您有两个显示器,一个分辨率为1280×1024的显示器位于1920×1200 左侧 ,那么前者的坐标将是(-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) 。 希望这可以帮助。

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

 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); 

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

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