在内核模块中拦截 X11 的键盘输入

在内核模块中拦截 X11 的键盘输入

我正在构建一个覆盖读取系统调用的内核模块。在那里我想替换键盘上的按键。通过替换文件描述符 = 0 的扫描代码,我成功地为终端输入做到了这一点。但是,GUI 应用程序在 ubuntu 中使用 X11,并且不使用 stdin 输入来读取键盘。如何拦截并替换按键他们到达 X11 服务器了吗? X11 使用特定的文件描述符吗?

答案1

Linux 上的 Xorg X11 服务器读取输入埃夫德夫设备位于/dev/input/event*.每个 read() 调用至少返回一个结构输入事件


您不需要自定义内核模块来替换事件 - 您可以仅使用用户空间工具来读取它们,根据需要进行更改,并将它们转发到现有的“uinput”模块,该模块允许您创建自定义 evdev 设备(很像 FUSE 或 CUSE) ),并以某种方式告诉 Xorg 忽略原始设备。这拦截工具套件可以这样做。

此外,现在大多数系统上的 Xorg 使用库输入用于预处理来自键盘和鼠标的事件的库。 (大多数 Wayland 显示服务器也专门使用 libinput。)您可以将此库修补到

最后,如果您只想重新映射单个键(或扫描码),则埃夫德夫子系统已经对此有内置支持。 Systemd-udev 已经附带了一个帮助程序,允许 udev 规则定义自定义扫描码到键的映射,如可以在这个数据库

事实上,如果您仍然想修补内核,最好不要单独使用 read() 并在 evdev 层执行翻译。 (毕竟,文件描述符 0 并不总是键盘——您真的不想弄乱从另一个程序传输的数据。)

相关内容