pyHook + pythoncom停止工作后太多的按键

这是我的脚本:

import pyHook import pythoncom hookManager = pyHook.HookManager() def onKeyboardEvent(event): if event.KeyID == 113: # F2 #do something# return True hookManager.KeyDown = onKeyboardEvent hookManager.HookKeyboard() pythoncom.PumpMessages() 

在键盘事件指定的键,或F2键作为我的脚本后,按下几次,脚本停止工作…

有人知道为什么 或者如何解决?

每次发生这种情况,我必须重新启动脚本,而且我必须在脚本中按下很多键。

也许你可以调用该函数作为一个线程异步执行,将它们添加到你自己的队列或设置一个条件,如果它已经在运行,不会执行,将停止填充这是失败的messagepump。
选项1.这会将函数执行添加到线程队列中:

    导入pythoncom,pyHook,线程
     lock = threading.Lock()  
     def myFunc(i):
         lock.acquire()#执行下一个函数,直到前一个完成
         #some代码
         lock.release()

     def OnKeyboardEvent(event):
         keyPressed = chr(event.Ascii)
        如果keyPressed =='z':
             t = threading.Thread(target = myFunc,args =(1,))#added to queue
             t.start()
        返回True

     hm = pyHook.HookManager()
     hm.KeyDown = OnKeyboardEvent
     hm.HookKeyboard()
     pythoncom.PumpMessages()

选项2,或者如果忙,它将忽略其他处理呼叫:


     def myFunc(i):
         myFunc.isRunning = True
         #some代码
         myFunc.isRunning = False
     myFunc.isRunning = False

     def OnKeyboardEvent(event):
         keyPressed = chr(event.Ascii)
        如果keyPressed =='z':
            如果不是myFunc.isRunning:#if函数正在执行忽略此调用
                 t = threading.Thread(target = myFunc,args =(1,))
                 t.start()
        返回True

当然,当你通过捕获异常来添加代码或者线程会被阻塞的时候,你应该小心。