Scancode Mapによるキー割り当ての変更

category: Misc | 2018-03-17

Scancode Map

キーボードのキー割り当ての変更をレジストリのScancode Mapを変更することで可能になります。

Scancodeは、キーボードでキーが入力された際にキーボードからCPUに送られてるコードの事です。
Scancode MapはScancodeの変換テーブルのことで、これを設定することでキー割り当ての変更をすることが可能です。

Scacode Mapはレジストリの
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout
の下に「Scancode Map」というバイナリ値で作成します。

フォーマット

Scancode Mapはヘッダーの後ろにキー割り当ての情報を入れ、最後にキー割り当て終端を意味するヌル値(0のこと)を入れます。

ヘッダーに記入するキーの割り当て数(マッピング数)ですが、これは最後に入れるヌル値を含める事と、Windowsはリトルエンディアンのため、値が前詰めになることに注意してください。

ヘッダー:バージョン(すべて0)4 byte
ヘッダー:フラグ(すべて0)4 byte
ヘッダー:マッピング数4 byte
キー割り当て--
Null4 byte

キー割り当ては、4byte値で表現し、前2byteが変換前のキー、後2byteで変換後のキーを表します。

例えば、Caps Lock(0x3A)を左Ctrl(0x1D)に変換する場合、0x003A001Dとなりますが、これもリトルエンディアンを意識する必要があるので、書く時は「1D 00 3A 00」になります。

例:「左Ctrl <-> Caps lock」「無変換 -> Enter」「変換 -> Back Space」

Scancode Map

00 00 00 00 00 00 00 00
05 00 00 00 1D 00 3A 00
3A 00 1D 00 1C 00 7B 00
0E 00 79 00 00 00 00 00

解説

バイナリ説明
00 00 00 000x00000000バージョン
00 00 00 000x00000000フラグ
05 00 00 000x00000005マッピング数
1D 00 3A 000x003A001DCaps Lock(0x1D) -> Enter(0x1D)
3A 00 1D 000x001D003AEnter(0x1D) -> Caps Lock(0x1D)
1C 00 7B 000x007B001C無変換(0x7B) -> Enter(0x1C)
0E 00 79 000x0079000E変換(0x79) -> Back Space(0x0E)
00 00 00 000x00000000終端ヌル値

Scancode

左Ctrl0x1D
Caps Lock0x3A
Enter0x1C
無変換7B
Back Space0x0E
変換0x79

参考

MSDN Keyboard and mouse class drivers - Scan code mapper for keyboards