Python中PyHook3鼠标监听时出现点击延迟0.3~1.1秒问题如何解决

请诸位看代码。 不知道为什么用 Pyhook3 监听鼠标事件后执行鼠标点击命令的话会出现延迟 1 秒左右并且之后的点击命令不会延迟的问题。

import pythoncom
import PyHook3 as pyHook
import win32api
import time
from pymouse import *

def main(function): # 创建狗子 hm = pyHook.HookManager() # 监听鼠标上台 hm.MouseLeftUp = lambda x: function(hm, x, pythoncom) # 开始监听 hm.HookMouse() # 进入循环 pythoncom.PumpMessages(10000) def start(hm, event, pythoncom): people_1 = list(event.Position) if people_1[0] > 50 or people_1[1] > 50: return True hm.UnhookMouse() win32api.PostQuitMessage() click_left_test(600,600) click_left_test(600,600) hm.HookMouse() pythoncom.PumpMessages(10000) return True

def click_left_test(x, y): x1 = time.time() print(‘之前的时间:’, x1) m.click(x, y, button=1) y1 = time.time() print(‘之后的时间:’, y1) print(“之间差”, y1 - x1) m = PyMouse() main(start)


Python中PyHook3鼠标监听时出现点击延迟0.3~1.1秒问题如何解决

3 回复

这个问题我遇到过,PyHook3的延迟确实挺烦人的。核心原因是PyHook3基于老旧的PyHook库,底层用的是Windows全局钩子,消息处理机制本身就慢。

给你两个解决方案:

方案一:改用pynput(推荐) 这是最直接的解决办法,pynput性能好得多:

from pynput import mouse
import time

def on_click(x, y, button, pressed):
    if pressed:
        print(f'点击时间: {time.time()}, 位置: ({x}, {y})')

# 启动监听
with mouse.Listener(on_click=on_click) as listener:
    listener.join()

方案二:优化PyHook3的回调函数 如果必须用PyHook3,尽量减少回调函数里的操作:

import pythoncom
import PyHook3 as pyHook
import time

last_time = time.time()

def on_mouse_event(event):
    global last_time
    current_time = time.time()
    
    # 只处理点击事件,避免不必要的判断
    if event.MessageName == 'mouse left down':
        print(f'点击检测: {current_time}')
        # 这里不要做耗时操作!
        # 不要在这里保存文件、网络请求等
    
    return True

# 创建钩子管理器
hm = pyHook.HookManager()
hm.SubscribeMouseAll(on_mouse_event)
hm.HookMouse()

# 消息循环
pythoncom.PumpMessages()

关键点:回调函数里越简单越好,复杂操作放到其他线程处理。不过说实话,PyHook3的延迟问题很难彻底解决,建议直接换pynput。

总结:换pynput吧,省心。


之前的时间: 1570878442.8022747
之后的时间: 1570878443.8039594
之间差 1.0016846656799316
之前的时间: 1570878443.8039594
之后的时间: 1570878443.809815
之间差 0.005855560302734375


这些是结果

没人可以回答这个难题吗?

回到顶部