pyautogui与pydirectinput的click函数失效:光标移动但无点击
光标可移动但无法执行点击的解决办法
你的问题核心是坐标匹配错误、窗口未彻底销毁导致输入被拦截,以及click函数的潜在问题,以下是针对性的修改方案:
问题分析
- 坐标不匹配:原代码中
event.x/event.y是tkinter窗口内的相对坐标,若系统开启DPI缩放,会和pydirectinput使用的全局屏幕坐标产生偏差,导致点击位置错误。 - 窗口未销毁:
overlay.quit()仅停止主循环,窗口仍在后台运行,可能拦截输入事件。 - click函数可靠性:部分场景下
p.click()内部逻辑可能失效,手动模拟鼠标按键更稳定。
修改后的完整代码
import tkinter as tk import pydirectinput as p import time coords = [0, 0] p.FAILSAFE = False def white_screen(): overlay = tk.Tk() def close(event): # 获取屏幕绝对坐标,替代窗口内相对坐标 coords[0] = overlay.winfo_pointerx() coords[1] = overlay.winfo_pointery() # 彻底销毁窗口,释放输入控制权 overlay.destroy() overlay.attributes("-fullscreen", True) overlay.attributes("-alpha", 0.3) overlay.configure(bg='white') overlay.bind("<Button-1>", close) overlay.mainloop() white_screen() # 等待窗口完全关闭 time.sleep(0.5) # 手动模拟两次点击动作 p.mouseDown(x=coords[0], y=coords[1]) p.mouseUp(x=coords[0], y=coords[1]) time.sleep(0.05) p.mouseDown(x=coords[0], y=coords[1]) p.mouseUp(x=coords[0], y=coords[1])
关键修改点说明
- 替换坐标获取方式:用
winfo_pointerx()/winfo_pointery()直接获取全局屏幕坐标,确保和pydirectinput的坐标体系一致。 - 彻底销毁窗口:调用
overlay.destroy()替代overlay.quit(),避免窗口后台拦截输入。 - 手动模拟点击:拆分
click为mouseDown和mouseUp,并加入短暂延迟,提升输入事件的可靠性。
内容的提问来源于stack exchange,提问作者Psychopath
相关产品推荐
相关产品推荐

