0

所以我正在编写一个记录击键的程序,它工作得很好,直到我点击远离程序框。当我像 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

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

4

1 回答 1

1

问题是您的回调函数OnKeyBoardEvent需要True/False在事件传播到系统的其余部分之前返回。这是因为 pyHook 是一个非常低级的拦截器。

正如我最近发现的那样,如果您的函数返回 a 的时间过长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
于 2016-06-19T16:46:31.273 回答