Python pyautogui脚本运行10分钟报windll.gdi32.GetPixel failed错误如何解决
错误产生原因
核心是Windows GDI接口GetPixel调用失败返回-1,触发该错误的常见场景如下:
- 脚本的
while循环无基础延迟,未匹配到目标像素时会以最高频率反复调用pyautogui.pixel(),运行10分钟后高频调用导致GDI资源泄漏耗尽,接口无法正常返回结果 - 运行过程中坐标(193, 52)所在区域被遮挡:比如弹出系统通知、窗口最小化、电脑进入锁屏/休眠状态、系统分辨率/DPI缩放变更、多显示器切换等,都会导致GDI无法读取对应位置像素
- Windows系统默认开启DPI缩放时,pyautogui的坐标映射和系统实际像素位置不匹配,也会提升该错误的触发概率
修复方案
按照优先级选择以下修改,可保证脚本稳定运行:
- 给循环增加基础延迟,同时添加异常捕获逻辑,避免单次调用失败导致整个脚本崩溃
- 代码开头添加DPI感知声明,适配Windows系统缩放,避免坐标偏移
- 可选优化:改为先截取全屏再从缓存图片中读像素,减少系统GDI接口的调用频率,稳定性更高
修改后的完整可运行代码参考:
from pyautogui import * import pyautogui import time import keyboard import random import win32api, win32con import ctypes # 开启DPI感知,适配系统缩放 ctypes.windll.shcore.SetProcessDpiAwareness(1) def click(x,y): win32api.SetCursorPos((x,y)) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0) while keyboard.is_pressed('q') == False: # 增加基础延迟,降低调用频率 time.sleep(0.05) try: if pyautogui.pixel(193, 52)[0] == 255: print("!") click(798, 386) time.sleep(1) # 捕获GDI调用异常,跳过本次循环继续执行 except OSError: continue
如果需要更高稳定性,可以替换为截屏读像素的逻辑:
while keyboard.is_pressed('q') == False: time.sleep(0.05) try: # 直接从截屏缓存读像素,减少系统接口调用 img = pyautogui.screenshot() if img.getpixel((193, 52))[0] == 255: print("!") click(798, 386) time.sleep(1) except OSError: continue
内容的提问来源于stack exchange,提问作者Do you know de way
相关产品推荐
相关产品推荐

