Python 2.7 将pyhook按键事件返回到线程队列
我正在尝试将一个简单的键盘记录器检测到的键盘按压路由到另一个线程。我的程序在线程中设置密钥日志记录,如下所示:Python 2.7 将pyhook按键事件返回到线程队列,python-2.7,queue,python-multithreading,keylogger,pyhook,Python 2.7,Queue,Python Multithreading,Keylogger,Pyhook,我正在尝试将一个简单的键盘记录器检测到的键盘按压路由到另一个线程。我的程序在线程中设置密钥日志记录,如下所示: 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 OnKeybo
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中,然后将其提供给thread1。您会注意到我的代码没有对q1.put()进行重要调用。老实说,我编程了“OnKeyboardEvent”函数来返回事件,但我不知道它返回到哪里,也不知道如何获取它。这就是我需要帮助的地方。我查看了HookManager()类定义,没有看到任何我认为可以使用的内容
对于任何有责任心的程序员来说,这是为了科学,而不是黑客。我试图根据键盘输入来控制跑步机的速度。这很糟糕,但我找到了一种方法,对HookManager.py中的HookManager类定义进行简单更改。毕竟它是开源的 我对HookManager类进行了以下更改:
def __init__(self):
#add the following line
self.keypressed = '' #make a new class property
def OnKeyboardEvent(self,event):
self.keypressed = event.key
return True
我还向HookManager类添加了以下方法:
def __init__(self):
#add the following line
self.keypressed = '' #make a new class property
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()
现在我可以从hookmanager本身获取任何按下的键,并将其传递给其他线程。就像我说的,不是很优雅,但很管用