Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在linux中是否可以在没有root用户权限的情况下捕获HID键盘事件 我想要什么_Python_Linux - Fatal编程技术网

Python 在linux中是否可以在没有root用户权限的情况下捕获HID键盘事件 我想要什么

Python 在linux中是否可以在没有root用户权限的情况下捕获HID键盘事件 我想要什么,python,linux,Python,Linux,编写一个脚本,读取usb键盘在没有root用户权限的情况下发送的内容 其目的是映射扫描码/HID id和用于编写键盘配置工具的结果文字输入;如果用户使用的是dvorak布局,则T键可输入文字Y,或Z键可输入文字ツ. 下面的代码片段在捕获扫描代码方面做得很好(usb键盘发送hid使用id,但它仍然捕获扫描代码),但需要/dev/input/*的读取权限,这并不理想 from evdev import * dev = InputDevice('/dev/input/event5') print(d

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

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

下面的代码片段在捕获扫描代码方面做得很好(usb键盘发送hid使用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))
是否在没有特殊许可的情况下仍可以执行此操作?

结论: X输入扩展2(XI2)提供对RawEvents的访问;虽然我在RawKeyPress事件中找不到我需要的东西:

将X11键码转换回扫描码的可能性只有一半

不详细,但我在这里对其进行了说明:

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

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

关键事件生成链: 这篇博文有一些关于键盘事件生成过程的细节:
----操作系统空间----------------

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

  • 无论是xwindow服务器还是android InputDeviceReader都可以读取表单
    /dev/input/event*
  • 如果我所读的是正确的,并且读的是正确的,那么
    /dev/input/event*
    上游的任何事情都会在内核中发生,任务由设备驱动程序处理。

    结论: X输入扩展2(XI2)提供对RawEvents的访问;虽然我在RawKeyPress事件中找不到我需要的东西:

    将X11键码转换回扫描码的可能性只有一半

    不详细,但我在这里对其进行了说明:

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

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

    关键事件生成链: 这篇博文有一些关于键盘事件生成过程的细节:
    ----操作系统空间----------------

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

  • 无论是xwindow服务器还是android InputDeviceReader都可以读取表单
    /dev/input/event*

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

    这是针对X11未使用的地方?(如果用户运行的是X服务器,您可以更轻松地从中获取扫描代码)谢谢,我在某个地方读到XServer隐藏了扫描代码,因此我没有研究过它(我尝试过pyxhook,它既没有捕获HID使用id,也没有捕获扫描代码)。我明天会调查X的。可能你是对的——我已经很久没有在这方面做过工作了。@Charles Duffy感谢Charles的指点,X核心协议没有提供任何东西,但XI2似乎可以做到这一点。遗憾的是,似乎没有针对XI2的python库,但为了满足我的需要,我可以使用通用的扫描码到键码转换规则将X11键码转换为扫描码?(如果用户运行的是X服务器,您可以更轻松地从中获取扫描代码)谢谢,我在某个地方读到XServer隐藏了扫描代码,因此我没有研究过它(我尝试过pyxhook,它既没有捕获HID使用id,也没有捕获扫描代码)。我明天会调查X的。可能你是对的——我已经很久没有在这方面做过工作了。@Charles Duffy感谢Charles的指点,X核心协议没有提供任何东西,但XI2似乎可以做到这一点。遗憾的是,似乎没有针对XI2的python库,但为了满足我的需要,我可以使用通用的扫描码到键码转换规则将X11键码转换为扫描码。