我试图编写一个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)。
任何想法?
答案 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
的事件,然后记住按键停机时间,并计算当你取回密钥代码时的按键时间。
请注意,您不能假设按键事件与之前的按键事件匹配(考虑一次按几个按键)。所以我在字典中跟踪关键代码和相应的按键时间。显然,你必须根据自己的需要进行调整。但正如我所说,这只是一个起点。