2010-09-09 80 views
2

這是我的腳本:pyHook + pythoncom停止按下太多的鍵後工作[python]的

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鍵來我的腳本中指定的鍵後,按下幾次,腳本停止工作...

任何人都知道爲什麼?或如何解決它?

我必須重新啓動腳本每次發生這種情況的時候,我不得不按鍵很多我的腳本...

+0

我有一個很熟悉的問題! 2010?我完蛋了。 – 2012-03-19 04:38:32

回答

2

也許你可以調用該函數的線程異步執行,將它們添加到你自己的隊列或設置一個條件,如果它已經在運行,則不執行,這將停止填充那個失敗的消息泵。
選項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 
當然

當您通過捕獲異常來添加代碼時,您應該小心,否則線程將保持阻塞狀態。

+1

你可以給你的答案添加一些代碼嗎? – 2012-10-01 06:46:01

+0

@Tichodroma added =) – shuji 2012-10-01 16:56:11

+0

我試過你的2個解決方案,它不起作用 – Aotoki 2018-01-07 22:53:56