0

そのため、キーストロークをログに記録するプログラムを作成していますが、プログラムのボックスをクリックするまでうまく機能します。ブラウザのコルタナのようにクリックして入力を開始すると、いくつかのストロークが記録されてから完全に停止しました。エラーも発生しなかったため、デバッグ方法がわかりません。

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 が非常に低レベルのインターセプトであるためです。

最近わかったように、関数が を返すのに時間がかかりすぎるとTrue/False、pyHook はキー押下を完全にインターセプトしなくなります。したがって、あなたがすべきことは、スレッドをセットアップしてTrueすぐに戻ることです。これにより、実行したいことは何でも非同期で実行できます。

以下のようなもの。一度に複数のスレッドが shelve にアクセスしていないことを確認するために、ロックを調べることができます。

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 に答える