2

単純なキーロガーによって検出されたキーボードの押下を別のスレッドにルーティングしようとしています。私のプログラムは、次のようなスレッドでキー ロギングを設定します。

import threading
import Queue
import pythoncom
import pyHook

stopevent = threading.Event() #how to stop each thread later
q1 = Queue.Queue() #a threading queue for inter proc comms

def OnKeyboardEvent(event):
    return event

def thread1(q1,stopevent):
    while (not stopevent.is_set()):
        print q1.get() #print what key events are registered/pumped

def thread2(q1,stopevent):
    hm = pyHook.HookManager()
    hm.KeyDown = OnKeyboardEvent
    hm.HookKeyboard()
    while (not stopevent.is_set()):
        pythoncom.PumpWaitingMessages()
        #q1.put(something????)
    hm.UnhookKeyboard()

t1 = threading.Thread(target=thread1,args=(q1,stopevent))
t2 = threading.Thread(target=thread2,args=(q1,stopevent))

t1.start()
t2.start()

フックによってキャプチャされた「イベント」をq1にルーティングしようとしています。これにより、スレッド1で使用できるようになります。私のコードが q1.put() の重要な呼び出しを行っていないことに気付くでしょう。正直なところ、イベントを返すように「OnKeyboardEvent」関数をプログラムしましたが、イベントがどこに返されるのか、またはどのように取得するのかわかりません。これは私が助けを必要としているものです。HookManager() クラス定義を調べましたが、使用できると思われるものは何もありませんでした。

良心的なプログラマーにとって、これはハッキングではなく科学のためのものです。キーボード入力に基づいてトレッドミルの速度を制御しようとしています。

4

1 に答える 1

1

これは汚いですが、HookManager.py の HookManager クラス定義に簡単な変更を加えることで、これを行う方法を見つけました。やっぱりオープンソースだ…

HookManager クラスに次の変更を加えました。

def __init__(self):
    #add the following line
    self.keypressed = '' #make a new class property

また、次のメソッドを HookManager クラスに追加しました。

def OnKeyboardEvent(self,event):
    self.keypressed = event.key
    return True

これらは HookManager への変更です。スレッドを作成すると、次のことができます。

import threading
import Queue
import pythoncom
import pyHook

stopevent = threading.Event() #how to stop each thread later
q1 = Queue.Queue() #a threading queue for inter proc comms

def thread1(q1,stopevent):
    while (not stopevent.is_set()):
        print q1.get() #print what key events are registered/pumped

def thread2(q1,stopevent):
    hm = pyHook.HookManager()
    hm.KeyDown = hm.OnKeyboardEvent
    hm.HookKeyboard()
    while (not stopevent.is_set()):
        pythoncom.PumpWaitingMessages()
        q1.put(hm.keypressed)
    hm.UnhookKeyboard()

t1 = threading.Thread(target=thread1,args=(q1,stopevent))
t2 = threading.Thread(target=thread2,args=(q1,stopevent))

t1.start()
t2.start()

これで、フックマネージャー自体から押されたキーを取得し、それを他のスレッドに渡すことができます。私が言ったように、本当にエレガントではありませんが、うまくいきます。

于 2016-09-07T18:02:43.693 に答える