2015-04-04 61 views
0

我正试图编写一个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),我想DiffTime从KEY_PRESSED(代码0)和KEY_RELEASED(代码1 )(time_pressed - time_released),即使密钥重复(事件代码2)。

任何想法?

+1

[格式为/dev/input/event\*?](http://stackoverflow.com/questions/5060710/format-of-dev-input-event) – 2015-04-04 20:59:43

+0

@SylvainLeroux:它看起来像一个比你所链接的问题更具体的问题。 – jfs 2015-04-05 11:56:59

+0

@ J.F.Sebastian我自己同意这个问题。但我认为一些答案有必要的信息来解决OP问题。无论如何,你可能是对的:所以,我已经综合了所有这一切,并将其作为答案发布在此处。 – 2015-04-05 12:46:53

回答

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; 
}; 

timeval结构是是反过来在bits/time.h定义为:

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

因此,事件的相应Python结构格式为llHHI。一旦你有了这些,你必须循环读取类型为EV_KEY的事件,然后记住关键时间,并在返回键入代码时计算按键时间。

请注意,您不能假定按键事件与前一按键事件相匹配(请考虑一次按几个按键)。因此,我会跟踪字典中的关键代码和相应的按键时间。显然,你将不得不适应你的需求。但正如我所说,这只是一个起点。