pyHook + pythoncom перестают работать после слишком большого количества нажатых клавиш [Python] - PullRequest
2 голосов
/ 09 сентября 2010

это мой сценарий:

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 в качестве сценария, сценарий перестает работать ...

Кто-нибудь знает почему?или как ее решить?

Мне нужно перезапускать скрипт каждый раз, когда это происходит, и мне приходится многократно нажимать клавишу в моем скрипте ...

1 Ответ

3 голосов
/ 01 октября 2012

Может быть, вы можете вызвать функцию как поток для асинхронного выполнения, добавить их в свою очередь или задать условие, чтобы оно не выполнялось, если оно уже запущено, что прекратит заполнять сообщение, которое не работает. Опция 1. Это добавит выполнение функции в очередь потоков:

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

Опция 2. или игнорирует другие вызовы обработки, если она занята:


    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

конечно, вы должны быть осторожны, когда добавляете код, фиксируя исключения, иначе поток останется заблокированным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...