我能知道键盘上按键的时间吗

2024-09-29 03:35:15 发布

您现在位置:Python中文网/ 问答频道 /正文

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

保持时间:按一个特定键的时间。 有向图时间:按不同键所需的时间。在

假设用户键入密码“COMPUTER”。我需要知道每一个键按下的时间。比如:

以上密码的保持时间为

C--200毫秒 O--130毫秒 M--150毫秒 毫秒--175便士 U——320毫秒 T——230毫秒 E--120毫秒 R——300毫秒

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

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


Tags: 项目用户密码键入风格记录时间生物
3条回答

看看ncurses。这是一个很好的工具来获取有关终端按键的信息。在

也看看this链接。在

你说过你更喜欢用C语言,但是因为你给它加了Python标签。。。:)

另外,既然你说你要构建一个数据集,我假设你必须邀请用户输入任意文本,所以你需要某种界面(图形或其他)。在

下面是一个使用pygame的快速示例。你可以简单地修改它,让用户输入特定的单词,但是,事实上,它只允许用户输入任意文本,记录所有按键的按键时间,并按用户退出时(即用户按Esc键时)键入的顺序打印每次保持和有向图时间。在

正如Kibibu所注意到的,向用户实时显示他正在键入的内容会导致延迟,这可能会掩盖实际的按键时间,因此此代码只显示用户在键入“Enter”时输入的内容。在

更新:它现在计算有向图和保持时间(不包括两种情况下的Enter)。在

更新2:根据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())

记录KeyDown和KeyUp事件,并对每个事件的时间戳进行区分。在

http://code.activestate.com/recipes/203830/

编辑: 您可能想看看wxPython,它会帮助您:

http://www.wxpython.org/onlinedocs.php

特别是:

http://docs.wxwidgets.org/stable/wx_wxkeyevent.html#wxkeyevent

相关问题 更多 >