首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >捕获虚拟屏幕(所有显示器)

捕获虚拟屏幕(所有显示器)
EN

Stack Overflow用户
提问于 2011-03-31 20:55:43
回答 3查看 7.5K关注 0票数 6

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

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

代码语言:javascript
复制
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);
EN

回答 3

Stack Overflow用户

发布于 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)。希望这能有所帮助。

票数 6
EN

Stack Overflow用户

发布于 2011-03-31 21:50:31

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

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

票数 2
EN

Stack Overflow用户

发布于 2011-06-23 13:42:12

就像Igor和Hans所说的,你必须指出源坐标:

代码语言:javascript
复制
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);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5500175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档