我可以获得在键盘上按下按键的时间

时间:2010-04-28 00:55:44

标签: c++ python c linux unix

我正在开展一个项目,我必须根据用户的按键风格开发生物密码。 假设用户键入密码20次,则记录他的击键,如

holdtime:按下特定键的时间。 有向图时间:按下不同的按键所需的时间。

假设用户键入密码“COMPUTER”。我需要知道按下每个键的时间。类似的东西:

上述密码的保持时间为

C-- 200ms O-- 130ms M-- 150ms P-- 175ms U-- 320ms T-- 230ms E-- 120ms R-- 300ms

这背后的理性是,每个用户都有不同的保持时间。说一个老人正在输入密码,他将花费更多时间然后学生。它对于特定的人来说是独一无二的。 要完成这个项目,我需要记录按下的每个键的时间。 如果有人能指导我如何获得这些时间,我将不胜感激。

从这里编辑.. 语言并不重要,但我更喜欢C语言。我对获取数据集更感兴趣。

5 个答案:

答案 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)

看看ncurses。它是获取终端中按键信息的绝佳工具。

也请查看this链接。

答案 3 :(得分:0)

如果您在圆锥模式下从终端读取,则可以在按下时读取每个按键。您不会看到keydown keyup事件,就像您捕获X事件一样,但它可能更容易,特别是如果您只是在控制台或终端中运行。

答案 4 :(得分:0)

答案是有条件的“是”。

如果您的语言/环境具有提供Key-Down和Key-Up事件的交互式键盘支持,那么您可以捕获它们之间的差异事件和时间。

这在网页上的JavaScript中非常简单,这也是向更广泛的受众展示您的工作的最简单方法。