Linux

鍵盤硬重映射鍵?

  • July 30, 2019

我正在嘗試找到一種方法來強制重新映射鍵盤鍵。

我嘗試使用 xmodmap 和 setxkbmap,但它們不適用於一個特定的應用程序。此類命令適用於 X 上的其他普通視窗/應用程序。

我認為應用程序可能正在讀取鍵盤原始數據並忽略 X 輸入?

那麼,如何在不使用 xmodmap 和 setxkbmap 的情況下重新映射鍵?如果有可能使用某些軟體來完成。

我還嘗試了 xkeycaps、xkbcomp,但沒有嘗試 loadkeys,因為它在 X 上執行。

我發現在這裡我可以嘗試setkeycodes“因為在分配核心鍵碼後,按鈕應該在 xorg 中工作”,但我也發現“你不能在 USB 鍵盤上使用 ‘setkeycodes’”,這就是我的情況(我有興趣以防萬一有人讓它在 ps2 上工作,因為我認為我可以使用適配器)。

這似乎很有希望“將掃描碼映射到鍵碼”,但經過幾次測試後沒有任何變化,它們是:

我在 vt1 找到了鍵碼“36”(“j”鍵),在 vt1showkey

找到了掃描碼“7e”(鍵盤“.”) vt1 與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..

Obs.: 不適用於:KEYBOARD_KEY_7e=j

一些更多的替代方法(通過@vinc17)來查找鍵:

evtest /dev/input/by-id/...

input-kbd 3(將id 索引放在ls -l /dev/input/by-id/*從ex.event3 中找到)

PS.:*如果您有興趣測試自己,該應用程序的相關執行緒是: http ://forums.thedarkmod.com/topic/14266-keyboard-issue-in-new-version-108/我的問題有是相同的:一些鍵(KP_Decimal,DownArrow,UpArrow,RightArrow)被忽略,並認為所有具有相同的值“0x00”

首先找到需要重新映射的密鑰的掃描碼,例如使用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 中包含不完整/錯誤的資訊/lib/udev/hwdb.d/60-keyboard.hwdb,但您可以查看該文件的最新開發版本和/或我的錯誤報告和有關文件和間距問題的討論。

如果這不起作用,則在臨時增加udevdwith的日誌級別後可能會發現問題(有關詳細資訊,udevadm control請參閱 udevadm(8) 手冊頁)。

udev對於204 等舊版本,此方法應該仍然有效。

引用自:https://unix.stackexchange.com/questions/156985