2016-04-29 2 views
0

, поэтому я пишу программу, которая записывает нажатия клавиш, и она отлично работает, пока я не закрою окно программы. когда я нажал, как cortana, браузер и начал печатать, он запустил несколько штрихов, а затем полностью остановился. Он также не выдавал никаких ошибок, поэтому я не знаю, как его отладить.Почему 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