我正在开展一个项目,我必须根据用户的按键风格开发生物密码。 假设用户键入密码20次,则记录他的击键,如
holdtime:按下特定键的时间。 有向图时间:按下不同的按键所需的时间。
假设用户键入密码“COMPUTER”。我需要知道按下每个键的时间。类似的东西:
上述密码的保持时间为
C-- 200ms O-- 130ms M-- 150ms P-- 175ms U-- 320ms T-- 230ms E-- 120ms R-- 300ms
这背后的理性是,每个用户都有不同的保持时间。说一个老人正在输入密码,他将花费更多时间然后学生。它对于特定的人来说是独一无二的。 要完成这个项目,我需要记录按下的每个键的时间。 如果有人能指导我如何获得这些时间,我将不胜感激。
从这里编辑.. 语言并不重要,但我更喜欢C语言。我对获取数据集更感兴趣。
答案 0 :(得分:6)
记录KeyDown和KeyUp事件,并在每个事件的时间戳上做差异。
http://code.activestate.com/recipes/203830/
编辑: 你可能想看看wxPython,它应该帮助你:
http://www.wxpython.org/onlinedocs.php
特别是:
http://docs.wxwidgets.org/stable/wx_wxkeyevent.html#wxkeyevent
答案 1 :(得分:3)
你提到你在C中更喜欢它,但是因为你标记了Python ......:)
此外,由于您说您正在寻找构建数据集,我假设您必须邀请用户输入任意文本,因此您需要某种界面(图形或其他)。
这是使用pygame的快速示例。您可以简单地修改它以要求用户键入特定的单词,但实际上,它只是让用户输入任意文本,记录所有按键的按下时间,并打印每个保持和有向图时间,按顺序当用户退出时(即,当用户按下Esc时),用户键入它。
正如Kibibu注意到的那样,向用户显示他实时键入的内容会引入延迟,这可能会掩盖真正的按键时间,因此此代码仅显示用户在键入“Enter”时键入的内容。
更新:它现在计算有向图和保持时间(在两种情况下都不包括Enter)。
Update2:根据Adi的要求,按顺序从显示平均值变为显示每个时间。
import sys
from collections import defaultdict
from time import time
import pygame
from pygame.key import name as keyname
from pygame.locals import *
# Mapping of a key to a list of holdtimes (from which you can average, etc)
holdtimes = defaultdict(list)
# Mapping of a key pair to a list of digraph times
digraphs = defaultdict(list)
# Keys which have been pressed down, but not up yet.
pending = {}
# Last key to be de-pressed, corresponding time).
last_key = None
# Text that the user has typed so far (one sublist for every Enter pressed)
typed_text = [[]]
def show_times():
all_text = [k for line in typed_text for k in line]
print "Holdtimes:"
for key in all_text:
print "%s: %.5f" % (key, holdtimes[key].pop(0))
print "Digraphs:"
for key1, key2 in zip(all_text, all_text[1:]):
print "(%s, %s): %.5f" % (key1, key2,
digraphs[(key1, key2)].pop(0))
def time_keypresses(events):
global last_key
for event in events:
if event.type == KEYDOWN:
# ESC exits the program
if event.key == K_ESCAPE:
show_times()
sys.exit(0)
t = pending[event.key] = time()
if last_key is not None:
if event.key != K_RETURN:
digraphs[(last_key[0], keyname(event.key))].append(t - last_key[1])
last_key = None
elif event.type == KEYUP:
if event.key == K_RETURN:
update_screen()
typed_text.append([])
pending.pop(event.key)
last_key = None
else:
t = time()
holdtimes[keyname(event.key)].append(t - pending.pop(event.key))
last_key = [keyname(event.key), t]
typed_text[-1].append(keyname(event.key))
# Any other event handling you might have would go here...
def update_screen():
global screen
screen.fill((255, 255, 255))
header_font = pygame.font.Font(None, 42)
header = header_font.render("Type away! Press 'Enter' to show.", True, (0, 0, 0))
header_rect = header.get_rect()
header_rect.centerx = screen.get_rect().centerx
header_rect.centery = screen.get_rect().centery - 100
text_font = pygame.font.Font(None, 32)
user_text = text_font.render("".join(typed_text[-1]) if typed_text[-1] else "...",
True, (0, 0, 255))
text_rect = user_text.get_rect()
text_rect.centerx = screen.get_rect().centerx
text_rect.centery = screen.get_rect().centery
screen.blit(header, header_rect)
screen.blit(user_text, text_rect)
pygame.display.update()
if __name__ == '__main__':
pygame.init()
window = pygame.display.set_mode((800, 600))
screen = pygame.display.get_surface()
update_screen()
while True:
time_keypresses(pygame.event.get())
答案 2 :(得分:2)
答案 3 :(得分:0)
如果您在圆锥模式下从终端读取,则可以在按下时读取每个按键。您不会看到keydown keyup事件,就像您捕获X事件一样,但它可能更容易,特别是如果您只是在控制台或终端中运行。
答案 4 :(得分:0)
答案是有条件的“是”。
如果您的语言/环境具有提供Key-Down和Key-Up事件的交互式键盘支持,那么您可以捕获它们之间的差异事件和时间。
这在网页上的JavaScript中非常简单,这也是向更广泛的受众展示您的工作的最简单方法。