最近项目中想实现截屏功能,使用的笔记本是高清屏,实际屏幕设置成了150%,所以在截屏的时候遇到个各种问题。
最开始使用PIL ImageGrab来截取屏幕,如果本来是100%的设置没有问题,能截取到全屏,但是150%或者其他设置的就会有问题,只能截取到屏幕的左上部分,无法截取到全屏。
from PIL import ImageGrab pic = ImageGrab.grab() # print(pic.size) pic.save(r'C:\Users\test\Desktop\Automation\python\pic.jpg')
但是这个问题很奇怪,也有的机器150%设置,但是执行后没有问题。
遇到这个问题后看到网上有个解决方法:在注册表中Computer\HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers添加python.exe和pythonw.exe路径信息进去,再次执行程序就能截取到全屏,用python代码添加注册表的话,要重新再次运行程序才能截取到全屏:
from PIL import ImageGrab import winreg reg = winreg.ConnectRegistry(None, winreg.HKEY_CURRENT_USER) key = winreg.OpenKey(reg, r'Control Panel\Desktop\WindowMetrics') # print(winreg.QueryValueEx(key, 'AppliedDPI')) if winreg.QueryValueEx(key, 'AppliedDPI')[0] != 96: key.Close() key = winreg.OpenKey(reg, r'SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers', 0, winreg.KEY_ALL_ACCESS) winreg.SetValueEx(key, r'C:\Users\test\AppData\Local\Continuum\anaconda3\pythonw.exe', 0, winreg.REG_SZ, 'HIGHDPIAWARE') winreg.SetValueEx(key, r'C:\Users\test\AppData\Local\Continuum\anaconda3\python.exe', 0, winreg.REG_SZ, 'HIGHDPIAWARE') key.Close() reg.Close() pic = ImageGrab.grab() # print(pic.size) pic.save(r'C:\Users\test\Desktop\Automation\python\pic.jpg')
考虑到以后会用到其他机器上,每次都需要执行2次才能截取到全屏,就弃用了此方法。
后来使用pyautogui来截取全屏,一般没有安装pyautogui,需要先安装:
pip install pyautogui
import pyautogui img = pyautogui.screenshot() img.save(r'C:\Users\test\Desktop\Automation\python\pic_pyautogui.jpg')
但是如果笔记本还有连接外接显示器,是截取不到外显上内容的,只能截取笔记本显示器上的内容。如果要截取到外显上内容,想到使用win32方法来实现按键盘上的截屏功能,从而来实现抓取全屏带外显内容:
import win32api import win32con from PIL import ImageGrab win32api.keybd_event(win32con.VK_SNAPSHOT, 0) im = ImageGrab.grabclipboard() im.save(r'C:\Users\test\Desktop\Automation\python\pic_screenshot.jpg')