作为一个起点,基于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
的事件,然后记住关键时间,并在返回键入代码时计算按键时间。
请注意,您不能假定按键事件与前一按键事件相匹配(请考虑一次按几个按键)。因此,我会跟踪字典中的关键代码和相应的按键时间。显然,你将不得不适应你的需求。但正如我所说,这只是一个起点。
[格式为/dev/input/event\*?](http://stackoverflow.com/questions/5060710/format-of-dev-input-event) – 2015-04-04 20:59:43
@SylvainLeroux:它看起来像一个比你所链接的问题更具体的问题。 – jfs 2015-04-05 11:56:59
@ J.F.Sebastian我自己同意这个问题。但我认为一些答案有必要的信息来解决OP问题。无论如何,你可能是对的:所以,我已经综合了所有这一切,并将其作为答案发布在此处。 – 2015-04-05 12:46:53