键盘硬重映射键?

键盘硬重映射键?

我正在尝试找到一种方法来强制重新映射键盘按键。
我尝试使用 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_后面跟着十六进制的扫描码(就像两者evtestinput-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,但是你可以看看该文件的最新开发版本和/或我的错误报告和讨论关于文档和间距问题。

如果这不起作用,暂时提高udevdwith的日志级别后可能会发现问题udevadm control(有关详细信息,请参阅 udevadm(8) 手册页)。

udev对于204等旧版本,这个方法应该仍然有效。

相关内容