我正在尝试使用 HWDB 重新映射LCtrl我CapsLock的 Microsoft Wired Keyboard 600,但无论出于什么原因,系统都看不到我所做的更改。
hwdb
我的规则如下:
evdev:input:b*v045Ep07F8*
KEYBOARD_KEY_3a=leftctrl
KEYBOARD_KEY_1d=capslock
供应商和型号代码来自lsusb
并被重新确认/sys/devices/pci0000:00/*
将配置文件复制到后/etc/udev/hwdb.d
,运行systemd-hwdb update
并发出udevadm trigger
键盘配置没有任何变化。
我也尝试过:
- 重新启动 — 没有帮助。
- 明确指定总线为
0003
— 没有帮助。 - 确认
evtest
我使用的键代码对于我的键盘来说是正确的——是的,这些是正确的键代码。 - 确认适用的规则已列出
sudo udevadm info /sys/class/input/eventX
- 是的,新规则已列出,应该是否意味着应用成功?但按键的行为与之前一样。
E: KEYBOARD_KEY_1d=capslock
E: KEYBOARD_KEY_3a=leftctrl
E: ID_USB_DRIVER=usbhid
当我使用它evdev:atkbd:dmi:*
作为设备标识符时,更改正确地应用于我的笔记本电脑键盘,所以我知道我用来重新映射按键的规则和过程应该是正确的,这一定是错误标识符的问题(虽然我已经五次检查过它)。
任何帮助将不胜感激。
答案1
事实证明我指定了错误的扫描码类型。使用 获取键码时evtest
,您会得到以下输出(假设按下了左移键):
...
Event: time xxx.xxx, type 4 (EV_MSC), code 4 (MSC_SCAN), value 700e1
Event: time xxx.xxx, type 1 (EV_KEY), code 42 (KEY_LEFTSHIFT), value 0
...
我使用的代码是标准密钥代码 (42)。但事实证明,这是错误的。
你应该在 hwdb 文件中指定的实际代码是扫描码来自该MSC_SCAN
行(在此示例中为 ,700e1
前面是 单词value
)
这有效:
evdev:input:b*v045Ep07F8*
KEYBOARD_KEY_70039=leftctrl
KEYBOARD_KEY_700e0=capslock
参考:重新绑定键盘按键@altlinux.org(虽然是俄文,但这是我在网上找到的强调这种细微差别的最全面的文章)
我清楚地记得在笔记本电脑上使用基本扫描码时它们能够正常工作。我不太清楚为什么会这样。也许它们恰好与EV_MSC
某些类型的键盘上的扫描码相匹配。