正如标题所说,我很好奇是否有一种方法可以配置ImageGrab.grab()模块来抓取,例如,在多显示器设置中抓取右侧屏幕,而不是左侧屏幕。
发布于 2012-02-08 09:10:12
不幸的是,由于PIL获得显示设备的尺寸的方式,这是不可能的。当它获得设备上下文时,它会为所有连接的监视器获取一个:
screen = CreateDC("DISPLAY", NULL, NULL, NULL); (display.c,第296行,版本1.1.7)
但是,为了获得显示尺寸,它使用以下代码:
width = GetDeviceCaps(screen, HORZRES);
height = GetDeviceCaps(screen, VERTRES);(display.c,第299-300行,版本1.1.7)
它只返回主活动监视器的尺寸。所有后续操作都是使用这些宽度和高度值完成的,最终得到的图像仅为主显示器的大小。
为了接收所有连接的监视器的屏幕截图,这两行需要替换为以下内容:
width = GetSystemMetrics(SM_CXVIRTUALSCREEN);
height = GetSystemMetrics(SM_CYVIRTUALSCREEN);之后,您需要重新编译PIL。这将为您提供虚拟屏幕的大小,即"...所有显示监视器的边界矩形。“[MSDN]
更正确的实现是使用EnumDisplayMonitors来获取各个监视器的设备上下文,同时更改ImageGrab.grab()的接口(或添加新函数)以允许选择特定的监视器,其设备上下文将用于其余操作。
https://stackoverflow.com/questions/9185797
复制相似问题