为什么pythoncom.pumpmessages()停止工作?

时间:2016-04-29 04:51:15

标签: python keylogger pyhook pythoncom

所以我正在编写一个记录击键的程序,直到我点击该程序的框后它才能运行。当我点击像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

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

1 个答案:

答案 0 :(得分: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