如何从内核输入键盘事件(从按键到释放)获得差异时间?

时间:2015-04-04 20:46:25

标签: python struct keyboard-events

我试图编写一个Python代码来从linux上的/ dev / input / event *中捕获事件。 我希望过滤事件类型,事件值,事件代码和时间(tv_sec和tv_usec)。

问题: 使用EventType = EV_KEY和Event_Code = 0,1,2(其中0 = key_release,1 = key_pressed,2 = key_repeat),我想从key_pressed(代码0)和key_released(代码1)(time_pressed - time_released)获得DiffTime如果重复密钥(事件代码2)。

任何想法?

1 个答案:

答案 0 :(得分:2)

作为一个起点,基于a solution by Treviño,这是一种快速且(大多数)脏的方式来捕获键盘事件并报告时间:

import struct

FORMAT = 'llHHI'
EVENT_SIZE = struct.calcsize(FORMAT)
EV_KEY = 0x01

KEY_DOWN = 1
KEY_AUTO = 2
KEY_UP = 0

devname = "/dev/input/event0"

def dt(sec_a, usec_a, sec_b, usec_b):
    return (sec_a+usec_a/1000000.) - (sec_b+usec_b/1000000)


with open(devname, "rb") as infile:
    kdtime = {}

    while True:
        event = infile.read(EVENT_SIZE)
        (tv_sec, tv_usec, typ, code, value) = struct.unpack(FORMAT, event)
        if typ == EV_KEY:
            if value == KEY_DOWN:
                kdtime[code] = (tv_sec, tv_usec)
            if value == KEY_UP and code in kdtime:
                print(code, dt(tv_sec, tv_usec, *kdtime[code]))
                del kdtime[code] # Not strictly required

来自Documentation/input/input.txt的事件由内核报告为:

struct input_event {
    struct timeval time;
    unsigned short type;
    unsigned short code;
    unsigned int value;
};

结构时间轮在bits/time.h中定义为:

struct timeval
  {
    __time_t tv_sec;            /* Seconds.  */
    __suseconds_t tv_usec;      /* Microseconds.  */
  };

因此,事件的相应Python结构格式为llHHI。一旦你有了这个,你通常需要循环读取类型为EV_KEY的事件,然后记住按键停机时间,并计算当你取回密钥代码时的按键时间。

请注意,您不能假设按键事件与之前的按键事件匹配(考虑一次按几个按键)。所以我在字典中跟踪关键代码和相应的按键时间。显然,你必须根据自己的需要进行调整。但正如我所说,这只是一个起点。