我正在尝试获取整个虚拟屏幕的屏幕截图。这意味着,不仅是主屏幕,还有连接到计算机的每个屏幕的图像。
有办法吗?我尝试使用它,但它不起作用:
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);
答案 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()
有错误,它无法捕获分层窗口(具有TransparencyKey
或Opacity
设置的类型)。在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);