在linux中,是否可以在没有root用户权限的情况下捕获HID键盘事件

2024-05-19 10:52:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我想要什么

编写一个脚本来读取HID usage ids usb键盘在没有root用户权限的情况下发送的内容。在

其目的是映射scancode/HID id和生成的文本输入,以便编写键盘配置工具;如果用户使用的是dvorak布局,则按T键可以输入文本Y,或者Z可以输入文本ツ。在

下面的代码片段在捕获scancode方面做得很好(usb键盘发送hid用法id,但它仍然捕获scancode),但是需要/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))

在没有特殊权限的情况下,还有什么可以做的吗?在


Tags: 用户dev文本脚本eventid权限input
1条回答
网友
1楼 · 发布于 2024-05-19 10:52:53

结论:

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*上游的键盘事件,没有某些权限是不可能的。在

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

关键事件生成链:

这篇博文有一些关于键盘事件生成过程的细节:https://seasonofcode.com/posts/internal-input-event-handling-in-the-linux-kernel-and-the-android-userspace.html
操作系统空间-

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

-用户空间

  1. 无论是xwindow服务器还是android InputDeviceReader都会读取表单/dev/input/event*

如果我读到的是正确的,并且读得对,/dev/input/event*的任何上游都会在内核中发生,任务由设备驱动程序处理。在

相关问题 更多 >

    热门问题