【问题标题】:why does pythoncom.pumpmessages() stop working?为什么 pythoncom.pumpmessages() 停止工作?
【发布时间】:2016-04-29 04:51:14
【问题描述】:

所以我正在编写一个记录击键的程序,它工作得很好,直到我点击远离程序框。当我像 cortana 一样点击浏览器并开始输入时,它记录了几下然后完全停止。它也没有抛出任何错误,所以我不知道如何调试它。

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

我不确定问题可能是什么,因为它不会引发错误。

【问题讨论】:

    标签: python keylogger pyhook pythoncom


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      • 2019-05-30
      • 2018-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多