在Linux

时间:2017-08-16 17:50:31

标签: python linux

我想要什么

编写一个脚本,读取没有root用户权限的HID使用ID usb键盘发送的内容。

目的是映射扫描码/ HID id以及用于编写键盘配置工具的结果文字输入;如果用户使用dvorak布局或者Z可以输入文字ツ,则按键可以输入文字Y.

下面的代码片段在捕获扫描码方面做得很好(usb键盘发送隐藏使用ID,但它仍然捕获扫描码),但需要/ dev / input / *的读取权限,不理想。

from evdev import *
dev = InputDevice('/dev/input/event5')

print(dev)

for event in dev.read_loop():
    if event.type == ecodes.EV_KEY:
        print(categorize(event))

无论如何都没有特殊权限吗?

1 个答案:

答案 0 :(得分:4)

结论:

X输入扩展2(XI2)提供对RawEvents的访问;虽然我在RawKeyPress事件中找不到我需要的东西:Capture XI2 RawKeyPress event and interpreting it with python

将X11密钥代码转换回扫描码的可能性有一半。

不详细,但我在此处注明:How to translate X11 keycode back to scancode or hid usage id reliably

至于捕捉/dev/input/event*上游的键盘事件,没有一些权限就不可能。

在python中对XI2的支持很差并且使用它似乎需要使用C库或编写X客户端库。最新版本的python3-xlib确实支持它,但至少我找不到文档并理解二进制数据并不容易。

关键事件生成链:

此博客文章提供了有关键盘事件生成过程的一些详细信息:https://seasonofcode.com/posts/internal-input-event-handling-in-the-linux-kernel-and-the-android-userspace.html
---- os space -------------

  1. 用户按键盘键
  2. 键盘将hidbp(一种数据包)发送到USB控制器
  3. USB控制器接收数据包并发出irq(中断请求)
  4. CPU响应irq并调用由键盘驱动程序设置的irq处理程序。 ---有点不确定
  5. irq handler存储数据包或事件,并在内核中为它处理函数调用并退出。
  6. 排队函数处理事件并将其报告给include / linux / input.h中的各种函数,并调用input_sync将事件写入设备文件,例如/dev/input/event1
  7. ---用户空间----

    1. 是xwindow服务器或android InputDeviceReader读取表单/dev/input/event*
    2. 如果我读到的是正确的并且已经正确阅读,/dev/input/event*上游的任何内容都会在内核中发生,任务由设备驱动程序处理。