我正在构建一个覆盖读取系统调用的内核模块。在那里,我想更换键盘上的按键。通过替换文件descriptor=0的扫描代码,我成功地完成了对终端输入的操作。但是,GUI应用程序在ubuntu中使用X11,并且它不使用stdin输入来读取键盘。在键压到达X11服务器之前,我如何拦截和替换它们?X11是否使用特定的文件描述符?
发布于 2021-11-25 18:49:43
Linux上的Xorg X11服务器读取来自/dev/input/event*的埃夫德夫设备的输入。每个read()调用至少返回一个结构输入_事件。
您不需要一个自定义内核模块来替换事件--您可以只使用用户空间工具来读取它们,根据需要进行更改,并将它们转发到现有的“uinput”模块,该模块允许您创建自定义的evdev设备(非常像FUSE或CUSE),并以某种方式告诉Xorg忽略原始设备。拦截工具工具包可以做到这一点。
此外,目前大多数系统上的Xorg都使用libinput库来预处理来自键盘和鼠标的事件。(大多数Wayland显示服务器也只使用libinput。)您可以将这个库修补到
最后,如果您只想重新映射单个键(或扫描代码),则evdev子系统已经对此提供了内置支持。Systemd已经提供了一个助手,它允许udev规则定义自定义扫描代码到密钥的映射,就像在这个数据库中所看到的那样。
实际上,如果您仍然想修补内核,那么最好还是不使用read(),在evdev层执行转换。(毕竟,文件描述符0并不总是键盘--你真的不想把另一个程序中的数据弄乱。)
https://unix.stackexchange.com/questions/679080
复制相似问题