首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在多显示器设置中选择ImageGrab.grab()抓取的屏幕?

如何在多显示器设置中选择ImageGrab.grab()抓取的屏幕?
EN

Stack Overflow用户
提问于 2012-02-08 07:42:24
回答 1查看 6.1K关注 0票数 9

正如标题所说,我很好奇是否有一种方法可以配置ImageGrab.grab()模块来抓取,例如,在多显示器设置中抓取右侧屏幕,而不是左侧屏幕。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-08 09:10:12

不幸的是,由于PIL获得显示设备的尺寸的方式,这是不可能的。当它获得设备上下文时,它会为所有连接的监视器获取一个:

代码语言:javascript
复制
screen = CreateDC("DISPLAY", NULL, NULL, NULL); 

(display.c,第296行,版本1.1.7)

但是,为了获得显示尺寸,它使用以下代码:

代码语言:javascript
复制
width = GetDeviceCaps(screen, HORZRES);
height = GetDeviceCaps(screen, VERTRES);

(display.c,第299-300行,版本1.1.7)

它只返回主活动监视器的尺寸。所有后续操作都是使用这些宽度和高度值完成的,最终得到的图像仅为主显示器的大小。

为了接收所有连接的监视器的屏幕截图,这两行需要替换为以下内容:

代码语言:javascript
复制
width = GetSystemMetrics(SM_CXVIRTUALSCREEN);
height = GetSystemMetrics(SM_CYVIRTUALSCREEN);

之后,您需要重新编译PIL。这将为您提供虚拟屏幕的大小,即"...所有显示监视器的边界矩形。“[MSDN]

更正确的实现是使用EnumDisplayMonitors来获取各个监视器的设备上下文,同时更改ImageGrab.grab()的接口(或添加新函数)以允许选择特定的监视器,其设备上下文将用于其余操作。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9185797

复制
相关文章

相似问题

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