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

PyAutoGUI脚本突发windll.gdi32.GetPixel failed返回-1报错

报错根因

windll.gdi32.GetPixel failed : return -1 这个错误是Windows GDI接口的原生行为,和PyAutoGUI、pyscreeze本身的代码逻辑无关:当调用GetPixel取色时,如果目标像素点不在当前可访问的屏幕设备上下文范围内,接口就会返回CLR_INVALID(值为-1),pyscreeze捕获到这个返回值就会抛出你看到的OSError。
结合你描述的「未改代码/环境、同接口的其他脚本正常、故障自行恢复」的特征,触发原因基本是以下几种临时场景,很多时候持续时间短到肉眼根本察觉不到:

  • 取色指令执行的瞬间,目标坐标被临时顶层元素遮挡:包括系统通知弹窗、输入法候选框、后台程序弹出的半透明浮窗、显卡驱动/安全软件的临时提示、甚至系统UI动画的过渡帧,刚好卡到取色的时间点就会触发报错
  • 图形栈临时异常:显卡驱动短暂重置、桌面进程explorer.exe卡顿、多显示器/显示缩放配置临时映射失效的时候,指定坐标的屏幕DC会短暂不可访问,等系统自行恢复后取色就回归正常
  • 目标坐标临时越界:如果你的钓鱼坐标是固定存储的配置值,游戏窗口偶尔因为焦点切换、全屏/窗口化状态临时切换发生位置偏移,导致取色坐标短暂落到屏幕显示范围外,也会触发这个错误
  • 另一个同逻辑脚本不受影响,只是因为它的取色时机、取色坐标刚好没撞上上述的异常窗口/系统卡顿的时间窗口,不是接口本身出现了损坏。
修复方案

这个属于偶发的系统层面临时异常,不需要重装Python、PyAutoGUI或者修改系统配置,给取色逻辑加容错即可彻底解决:

  1. 给取色操作加短间隔重试,99%的场景下重试1-2次就能避开临时异常,参考实现:
import time
import pyautogui

def stable_pixel_match(x, y, target_rgb, tolerance=50, retry_times=3):
    for attempt in range(retry_times):
        try:
            return pyautogui.pixelMatchesColor(int(x), int(y), target_rgb, tolerance=tolerance)
        except OSError as err:
            if "GetPixel failed" in str(err) and attempt < retry_times - 1:
                time.sleep(0.1)
                continue
            raise
# 替换原代码里的pixelMatchesColor调用即可
pxFish = stable_pixel_match(fishLocX[i], fishLocY[i], (76, 76, 76), tolerance=50)
  1. 可选加一层坐标合法性校验,避免窗口位置偏移导致坐标落到屏幕外:
screen_width, screen_height = pyautogui.size()
x, y = int(fishLocX[i]), int(fishLocY[i])
if 0 <= x < screen_width and 0 <= y < screen_height:
    # 坐标合法再执行取色逻辑
    pxFish = stable_pixel_match(x, y, (76, 76, 76), tolerance=50)
else:
    # 坐标越界时执行窗口重定位等自定义逻辑
    pass

你之前一个月运行没遇到这个问题,只是之前运行时没有撞上上述的临时触发场景,不是脚本或者环境突然损坏。

内容的提问来源于stack exchange,提问作者dooby

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 00:48:24