pyHook + pythoncom stop working after too much keys pressed [Python]
Asked Answered
P

1

2

this is my script:

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

after the key specified on the keyboard event, or the F2 key as my script, is pressed for several times, the script stop working...

Anyone knows why? or how to solve it?

I have to restart the script every time this happens, and I have to press the key a lot in my script...

Peewit answered 9/9, 2010 at 4:24 Comment(2)
I'm having a smiliar problem! 2010?! I'M DOOMED.Meteoritics
Anyone falling here - just try calling pythoncom.PumpMessages() more often.Hypostasize
A
3

Maybe you can call the function as a Thread to execute asynchronously, add them to your own queue or set a condition to not execute if it's already running, that will stop filling the messagepump which is that is failing.
Option 1. This will add the function execution to the threads queue:

    import pythoncom, pyHook, threading
    lock = threading.Lock()  
    def myFunc(i):
        lock.acquire() #execute next function until previous has finished
        #some code
        lock.release()

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

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

Option 2. or this will ignore other processing calls if it's busy:


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

    def OnKeyboardEvent(event):
        keyPressed = chr(event.Ascii)
        if keyPressed == 'z':
            if not myFunc.isRunning: #if function is being executed ignore this call
                t = threading.Thread(target=myFunc,args=(1,))
                t.start()
        return True

of course you should be careful when you add code by capturing exceptions or the thread will stay blocked.

Appurtenant answered 9/9, 2010 at 4:24 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.