调用pyautogui.click后程序挂起停止,按Ctrl+C才恢复如何解决
故障原因
- Windows平台下,pyautogui和win32api模拟鼠标点击的底层均调用
user32.dll的SendInput接口,该接口默认为同步调用:点击指令发送后会等待被点击目标窗口的消息循环处理完该事件才返回。若被点击坐标对应的程序处于未响应状态、消息循环阻塞,就会连带Python进程一同挂起,直到目标程序响应或者你手动发送中断信号(Ctrl+C)。 - 触发场景还包括:点击的目标窗口运行在管理员权限下,Python脚本以普通权限运行,权限隔离导致消息投递进入等待状态;Windows系统开启了「单击锁定」鼠标功能,点击事件未完成触发导致接口持续等待。
- 你切换多个pyautogui版本、win32api也能复现问题,说明故障和pyautogui本身无关,属于系统层或被点击目标的问题。
解决方案
1. 排查被点击目标状态
首先确认坐标(956, 222)对应的窗口程序是否正常,手动点击该位置操作对应程序是否存在卡顿,若目标程序本身未响应,修复目标程序后故障即可消失。
2. 改用异步点击实现
若目标程序无法调整,可替换为非阻塞的点击实现,不需要等待目标程序处理事件:
import win32api import win32con import win32gui def async_click(x, y): lparam = (y << 16) | x hwnd = win32gui.WindowFromPoint((x, y)) # 直接投递消息,不等待返回,不会阻塞进程 win32gui.PostMessage(hwnd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, lparam) win32gui.PostMessage(hwnd, win32con.WM_LBUTTONUP, 0, lparam) async_click(956, 222) print("Hello")
3. 调整权限和系统配置
- 若点击的是管理员权限运行的窗口,给Python脚本也授予管理员权限运行即可解决权限隔离导致的阻塞。
- 检查Windows鼠标设置,关闭「单击锁定」功能。
- 运行脚本前切换到英文输入法,避免中文输入法拦截消息队列导致阻塞。
4. pyautogui临时测试配置
如果需要继续使用pyautogui接口,可先调整全局配置测试:
import pyautogui # 关闭操作后的默认等待时间 pyautogui.PAUSE = 0 # 测试时临时关闭角落故障安全机制 pyautogui.FAILSAFE = False pyautogui.click(956, 222) print("Hello")
内容的提问来源于stack exchange,提问作者ThisIsRome90
相关产品推荐
相关产品推荐

