Zac*_*ack 6 python python-imaging-library
就像标题所说,我很好奇是否有办法配置ImageGrab.grab()模块来抓取,例如,在多显示器设置中,而不是左边的屏幕.
遗憾的是,由于PIL获得显示装置的尺寸的方式,这是不可能的.获取设备上下文时,它会为所有连接的监视器获取一个:
screen = CreateDC("DISPLAY", NULL, NULL, NULL);
Run Code Online (Sandbox Code Playgroud)
(display.c,第296行,1.1.7版)
但是,要获取显示尺寸,它使用以下代码:
width = GetDeviceCaps(screen, HORZRES);
height = GetDeviceCaps(screen, VERTRES);
Run Code Online (Sandbox Code Playgroud)
(display.c,第299-300行,1.1.7版)
仅返回主要活动监视器的尺寸.所有后续操作都使用这些宽度和高度值完成,从而产生的最终图像仅为主显示的大小.
为了接收所有连接的监视器的屏幕抓取,这两行将需要替换为:
width = GetSystemMetrics(SM_CXVIRTUALSCREEN);
height = GetSystemMetrics(SM_CYVIRTUALSCREEN);
Run Code Online (Sandbox Code Playgroud)
之后你需要重新编译PIL.这将为您提供虚拟屏幕的尺寸,即"......所有显示器的边界矩形".[ MSDN ]
更正确的实现是使用EnumDisplayMonitors获取各个监视器的设备上下文,同时更改ImageGrab.grab()的接口(或添加新功能)以允许选择特定的监视器,其设备上下文将是用于剩余的操作.