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

pyautogui与pydirectinput的click函数失效:光标移动但无点击

光标可移动但无法执行点击的解决办法

你的问题核心是坐标匹配错误、窗口未彻底销毁导致输入被拦截,以及click函数的潜在问题,以下是针对性的修改方案:

问题分析

  1. 坐标不匹配:原代码中event.x/event.y是tkinter窗口内的相对坐标,若系统开启DPI缩放,会和pydirectinput使用的全局屏幕坐标产生偏差,导致点击位置错误。
  2. 窗口未销毁:overlay.quit()仅停止主循环,窗口仍在后台运行,可能拦截输入事件。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 23:35:26