pyHook + pythoncom deja de funcionar después de presionar demasiadas teclas

este es mi guión

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() 

después de presionar la tecla especificada en el evento del teclado, o la tecla F2 como mi script, varias veces, el script deja de funcionar …

Alguien sabe por qué? ¿O cómo resolverlo?

Tengo que reiniciar el script cada vez que esto sucede, y tengo que presionar mucho la tecla en mi script …

Tal vez pueda llamar a la función como un subproceso para ejecutarse de forma asíncrona, agregarlos a su propia cola o establecer una condición para que no se ejecute si ya se está ejecutando, eso dejará de llenar el mensaje de volcado, que es el que está fallando.
Opción 1. Esto agregará la ejecución de la función a la cola de hilos:

     importar pythoncom, pyHook, threading
     lock = threading.Lock ()  
     def myFunc (i):
         lock.acquire () #execute la siguiente función hasta que finalice la anterior
         # algún código
         Lock.release ()

     def OnKeyboardEvent (evento):
         keyPressed = chr (event.Ascii)
         si keyPressed == 'z':
             t = threading.Thread (target = myFunc, args = (1,)) #added a la cola
             t.start ()
         volver verdadero

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

Opción 2. o esto ignorará otras llamadas de procesamiento si está ocupado:


     def myFunc (i):
         myFunc.isRunning = True
         # algún código
         myFunc.isRunning = False
     myFunc.isRunning = False

     def OnKeyboardEvent (evento):
         keyPressed = chr (event.Ascii)
         si keyPressed == 'z':
             si no es myFunc.isRunning: la función #if se está ejecutando ignora esta llamada
                 t = threading.Thread (target = myFunc, args = (1,))
                 t.start ()
         volver verdadero

por supuesto, debe tener cuidado al agregar código al capturar excepciones o el hilo permanecerá bloqueado.