2016-04-29 36 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を返します。これにより、非同期で実行したいことが何でもできます。

次のようなものです。あなたは、一度に複数のスレッドによってshelveがアクセスされていないことを確認するためにロックを調べることができます。

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 
関連する問題