将鼠标按钮重新映射到键盘键

M R*_*M R 1 mouse keyboard

我正在尝试重新映射我的鼠标按钮,两侧的按钮并单击鼠标中键到键盘上的 4、5、6 键,找到了一些指南,但我对 Ubuntu 和 linux 总体上还是很陌生,我尝试这样做几天了但无济于事..有人可以指导我完成那个或指向我一些菜鸟可以遵循的综合指南吗?任何帮助将不胜感激。

dan*_*zel 7

这个问题基本上有两种方法:

  • 将一个动作绑定到鼠标按钮并伪造一个按键

或者

  • 将鼠标按钮的扫描码映射到不同的键码

后者仅在输入驱动程序报告特定按钮的扫描码时才有效。我拥有的所有鼠标都报告除滚轮之外的所有按钮的扫描码。

我个人更喜欢重新映射扫描码,所以我只会解释这种方法。

将鼠标按钮的扫描码重新映射到不同的键码

这或多或少与我在此处描述的过程相同。

运行sudo evtest(您可能必须先安装evtest)并选择鼠标。按下要重新映射的按钮(如果没有看到任何输出,请按Ctrl+C并重复该过程,直到找到鼠标)。输出应包含如下所示的行:

Event: time 1558613958.149431, type 4 (EV_MSC), code 4 (MSC_SCAN), value 90004
Event: time 1558613958.149431, type 1 (EV_KEY), code 275 (BTN_SIDE), value 1
Event: time 1558613958.149431, -------------- SYN_REPORT ------------
Run Code Online (Sandbox Code Playgroud)

第一行告诉我们扫描码(在我的情况下90004),第二行报告当前映射的键码(在我的情况下BTN_SIDE)。记下要重新映射的所有鼠标按钮的扫描码。

现在运行以下命令,其中 eventX 是您在使用时选择的命令evtest

grep "" /sys/class/input/eventX/device/id/*
Run Code Online (Sandbox Code Playgroud)

这会告诉您鼠标的总线类型、供应商、产品和版本。在我的情况下,输出是:

/sys/class/input/event7/device/id/bustype:0003
/sys/class/input/event7/device/id/product:4102
/sys/class/input/event7/device/id/vendor:062a
/sys/class/input/event7/device/id/version:0110
Run Code Online (Sandbox Code Playgroud)

现在创建以下文件:

/etc/udev/hwdb.d/99-mouse-remap.hwdb

evdev:input:b[bustype]v[vendor]p[product]e[version]*
 ID_INPUT_KEY=1
 KEYBOARD_KEY_[scancode]=4
 KEYBOARD_KEY_[scancode]=5
 KEYBOARD_KEY_[scancode]=6
Run Code Online (Sandbox Code Playgroud)

...在哪里

  • [bustype], [vendor], [product] 和 [version] 是上一步得到的,字母转换为大写
  • [scancode] 是第一步中的字母转换为小写的
  • evdev:...没有前面的空格
  • 这些KEYBOARD_KEY...前面正好有一个空格

对于我的鼠标,该文件将如下所示:

evdev:input:b0003v062Ap4102e0110*
 ID_INPUT_KEY=1
 KEYBOARD_KEY_90003=4
 KEYBOARD_KEY_90004=5
 KEYBOARD_KEY_90005=6
Run Code Online (Sandbox Code Playgroud)

现在运行sudo systemd-hwdb update并重新启动。

  • @Zulgrib 鼠标滚轮通常由内核输入驱动程序报告为相对轴。到虚拟鼠标按钮的转换(并生成按下/释放事件)发生在稍后阶段,并且不能通过简单的重新映射来实现。不过,您可以查看“evtest”的输出。如果您的鼠标滚轮生成按键事件和扫描码,您可以使用此方法重新映射它。如果没有,您可以尝试将“xbindkeys”与“xdotools”结合使用(如果您正在运行 Xorg)。作为最后的手段,您可以尝试使用“python-evdev”通过 python 脚本来实现此目的。 (2认同)