问题描述
我正在尝试创建一个行为生物识别工具,该工具使用键盘使用模式来识别用户。这个想法是捕捉用户如何输入,而不是什么。我考虑过捕捉用户按下和释放一个键所需的时间,以及从一个键按下到另一个的时间。
我一直在研究 jnativehook,但我只找到了“键盘记录器”类型的程序和教程,与 pynput 相同,我认为不可能使用我描述的方式......
有人可以给我一个提示或教程来做这样的事情吗?
谢谢。
解决方法
pynput
可以运行一个函数 on press
和另一个 on release
并且这两个函数都可以将当前时间保存在两个变量中。如果你在一个函数中减去它们,那么你应该得到被按下的时间,如果你在另一个函数中减去它们那么你应该得到释放的时间。
在代码中,我检查任何键之间的时间以及单独检查每个键。
from pynput import keyboard
import datetime
# --- data ---
press_time = None
release_time = None
keys_press_time = {}
keys_release_time = {}
# --- functions ---
def press(key):
global press_time
press_time = datetime.datetime.now()
if release_time:
print('how long was released:',press_time - release_time,'key: ANY')
# --- individual keys ---
keys_press_time[key] = press_time
if key in keys_release_time:
print('how long was released:',keys_press_time[key] - keys_release_time[key],'key:',str(key))
def release(key):
global release_time
release_time = datetime.datetime.now()
if press_time:
print('how long was pressed :',release_time - press_time,'key: ANY')
# --- individual keys ---
keys_release_time[key] = release_time
if key in keys_press_time:
print('how long was pressed :',keys_release_time[key] - keys_press_time[key],str(key))
# --- main ---
with keyboard.Listener(on_press=press,on_release=release) as listener:
# ... other code ...
listener.join()
唯一的问题是,当您将某个密钥保留更长时间并且系统开始重复密钥(它生成 release
事件)时,它会提供更短的时间。它需要关闭系统中的“重复”或者需要更复杂的代码来减少这个问题。
顺便说一句:我认为你可以用非常相似的方式对 jnativehook
做同样的事情。