You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 20:54:04