我正在尝试获取整个虚拟屏幕的屏幕截图。这意味着,不仅是主屏幕的图像,而且是连接到计算机的每个屏幕的图像。
有没有办法做到这一点?我试着使用这个,但它不起作用:
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);发布于 2011-03-31 21:15:01
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)。希望这能有所帮助。
发布于 2011-03-31 21:50:31
Igor是对的,为SourceX/Y参数传递0,0是不正确的。迭代Screen.AllScreens属性中的Screen实例以查找边界矩形。注意,CopyFromScreen()有一个bug,它不能捕获分层窗口(那种设置了TransparencyKey或Opacity的窗口)。请在this thread中查看我的答案以了解解决方法。
请注意,捕获整个桌面并不总是实用的,当屏幕没有排列成完美的矩形时,您会得到许多黑色,并且OutOfMemory异常在具有高分辨率显示器的32位计算机上并不少见。
发布于 2011-06-23 13:42:12
就像Igor和Hans所说的,你必须指出源坐标:
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);https://stackoverflow.com/questions/5500175
复制相似问题