我正在尝试找到一种方法来强制重新映射键盘按键。
我尝试使用 xmodmap 和 setxkbmap,但它们不适用于某一特定应用程序。此类命令适用于 X 上的其他正常窗口/应用程序。
我认为应用程序可能正在读取键盘原始数据并忽略 X 输入?
那么,如何在不使用 xmodmap 和 setxkbmap 的情况下重新映射键呢?如果可以使用某些软件来完成。
我还尝试了 xkeycaps、xkbcomp,但没有尝试 loadkeys,因为它在 X 上运行。
我发现这里我可以尝试setkeycodes
,“因为分配内核键码后按钮应该在 xorg 中工作”,但我也发现“您不能在 USB 键盘上使用‘setkeycodes’”,这就是我的情况(我感兴趣的是有人让它在 ps2 上工作,因为我认为我可以使用适配器)。
这看起来很有希望“将扫描码映射到键码”,但经过几次测试后没有任何变化,如下:
我在 vt1 上找到了键码“36”(“j”键),showkey
我在 vt1 上发现了扫描码“7e”(键盘“.”)showkey --scancodes
$cat >/etc/udev/hwdb.d/90-custom-keyboard.hwdb
keyboard:usb:v*p*
keyboard:dmi:bvn*:bvr*:bd*:svn*:pn*:pvr*
KEYBOARD_KEY_7e=36
$udevadm hwdb --update #updates file: /lib/udev/hwdb.bin
$udevadm trigger #should apply the changes but nothing happened
$cat /lib/udev/hwdb.bin |egrep "KEYBOARD_KEY_7e.{10}" -ao
KEYBOARD_KEY_7eleftmeta
$#that cat on hwdb.bin did not change after the commands..
观察:也不适用于:KEYBOARD_KEY_7e=j
一些更多的替代方法(由@vinc17)来查找键:
evtest /dev/input/by-id/...
或者(放置从 ex.event3
input-kbd 3
中找到的 id 索引)ls -l /dev/input/by-id/*
PS.:*如果您有兴趣自行测试,该应用程序的相关线程是这样的: http://forums.thedarkmod.com/topic/14266-keyboard-issue-in-new-version-108/我遇到的问题是相同的:一些键(KP_Decimal、DownArrow、UpArrow、RightArrow)被忽略,并被认为在“0x00”处具有相同的值
答案1
首先找到需要重新映射的按键的扫描码,例如使用evtest
实用程序。MSC_SCAN
应输出如下一行(其中包含):
Event: time 1417131619.686259, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70068
接下来的第二个给出当前的密钥代码。如果没有MSC_SCAN
输出任何行,这是由于内核驱动程序错误造成的,但仍然可以使用该input-kbd
实用程序找到扫描码;evtest
应该给出关键代码,以便应该很容易在输出中找到相应的行input-kbd
(例如通过使用grep
)。
确定要重新映射的按键的扫描码后,创建一个文件,例如/etc/udev/hwdb.d/98-custom-keyboard.hwdb
包含重新映射的文件。文件的开头/lib/udev/hwdb.d/60-keyboard.hwdb
提供了一些信息。就我而言(有效),我有:
evdev:input:b0003v05ACp0221*
KEYBOARD_KEY_70035=102nd # Left to z: backslash bar
KEYBOARD_KEY_70064=grave # Left to 1: grave notsign
KEYBOARD_KEY_70068=insert # F13: Insert
(在 udev 220 之前,我必须使用keyboard:usb:v05ACp0221*
第一行。)
该evdev:
字符串必须位于行的开头。请注意,供应商和产品 ID 中的字母应为大写字母。每个KEYBOARD_KEY_
设置之前都应该有一个空格(注意:没有空格的行将给出错误消息,有两个空格的行将给出错误消息)默默旧的 udev 版本被忽略)。KEYBOARD_KEY_
后面跟着十六进制的扫描码(就像两者evtest
和input-kbd
给出的一样)。有效值可以从evtest
输出或input-kbd
输出中获得,甚至可以从/usr/include/linux/input.h
文件中获得:例如,KEY_102ND
将给出102nd
(通过删除KEY_
并转换为小写字母),我在上面使用了它。
保存文件后,输入:
udevadm hwdb --update
(重新)构建数据库/etc/udev/hwdb.bin
(您可以检查其时间戳)。然后,
udevadm trigger --sysname-match="event*"
将考虑新设置。您可以使用 进行检查evtest
。
2014年,发布的udev中有不完整/有bug的信息/lib/udev/hwdb.d/60-keyboard.hwdb
,但是你可以看看该文件的最新开发版本和/或我的错误报告和讨论关于文档和间距问题。
如果这不起作用,暂时提高udevd
with的日志级别后可能会发现问题udevadm control
(有关详细信息,请参阅 udevadm(8) 手册页)。
udev
对于204等旧版本,这个方法应该仍然有效。