【问题标题】:How to get diff time from kernel input keyboard events(from key pressed to release)?如何从内核输入键盘事件(从按键到释放)获取差异时间?
【发布时间】:2015-04-04 20:46:25
【问题描述】:

我正在尝试编写 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)。

有什么想法吗?

【问题讨论】:

  • format of /dev/input/event*? 的可能重复项
  • @SylvainLeroux:看起来比您链接的问题更具体。
  • @J.F.Sebastian 我同意这个问题本身。但我认为一些答案有必要的信息来解决 OP 问题。无论如何,你可能是对的:所以,我已经尽力综合了所有这些,并将其作为答案发布在这里。

标签: python struct keyboard-events


【解决方案1】:

作为一个起点,基于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;
};

struct timeval 在bits/time.h 中定义为:

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

所以一个事件对应的 Python 结构格式是llHHI。一旦你有了这个,你主要需要循环读取类型为EV_KEY的事件,然后记住按键时间,并在你取回按键代码时计算按键时间。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 2014-12-28
    • 2015-01-28
    • 2011-10-19
    • 2010-11-29
    相关资源
    最近更新 更多