web-dev-qa-db-ja.com

コンピュータタイプのキーの組み合わせを文字にマッピングする方法はありますか?

Mキーボードのキー「h」が機能しなかったので、キーの組み合わせを上書きして入力できるようにしたい。その間。

例は

Alt+P to return h and maybe
Alt+shift+h to return H
1
novapack

キーボードの再マッピング

Scancode Map at HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layoutは、別のキーが押されたか(またはキーが押されていない)かのようにキーを動作させることができます。通常は存在しません。

この構造は、あるキーを別のキーにマップします(またはキーなしにマップします)。

設定内容を読み取るには:文字の各ペアはバイトです。 4組の文字はそれぞれdword(32ビット)です。最初のdwordはヘッダーであり、すべてゼロです。 2番目のdwordはフラグであり、通常はすべてゼロです。 3番目のdwordは、再マップされたキーの数に1を加えたものです。再マップされた各キーは1つのdwordです。これらのdwordの最初のWord(2組の文字)はキーが実行するものであり、2番目のWordは再マップするキーです(最初のWordはキーを無効にするためにゼロになります)。最後に、ゼロのdwordがあります(記録される再マップされたキーの数が1を足した数である理由)。

Intelプロセッサは、バイト順を逆にして数値を格納します。再マップされたキーの数である3番目のdwordでは、2の数が02,00,00,00として格納されます。 Dwordは、右から左に文字のペアで読み取られます。ただし、dwordのバイトではなく、dword自体は、最初から最後まで、従来の順序になっています。

"Scancode Map"=hex:00,00,00,00,00,00,00,00,02,00,00,00,43,00,1d,00,00,00,00,00

F9キーをLeftControlキーと交換する上記のエントリをデコードするには、dwordに分割します。

00,00,00,00, (Header)
00,00,00,00, (Flags)
02,00,00,00, (Number of records of remapped keys and the end marker)
43,00,1d,00, (Record 1 - second key - Left Control (001d) becomes first key - F9 (0043) and vice versa)
00,00,00,00  (End Marker)

もう1つの例は、両方のWindowsキーを無効にすることです。

"Scancode Map"=hex:00,00,00,00,00,00,00,00,03,00,00,00,00,00,5B,E0,00,00,5C,E0,00,00,00,00

上記のエントリをデコードします。

00,00,00,00, (Header)
00,00,00,00, (Flags)
03,00,00,00, (Number of records of remapped keys and the end marker)
00,00,5B,E0, (Record 1 - second key - Left Winkey (e05b) becomes first key which is nothing (0000))
00,00,5C,E0, (Record 2 - second key - Right Winkey (e05c) becomes first key which is nothing (0000))
00,00,00,00, (End Marker)

初期のキーボードには最新のキーボードのすべてのキーがなかったため、スキャンコードを表現する方法には通常と拡張の2つがあります。 Normalは1バイトで、Wordの先頭にゼロを付けて埋めます(2バイト)。拡張は2バイトで、この目的のためにE0で始まるスキャンコードがあります。このコンテキストに関係のないその他のものは00で始まります。E0または00は、コードが使用可能になるときにキーボードから再読み取りするようにプログラムに指示します。単一のキーはすべてE0で始まります。基本的には、カーソルキー、右側の修飾キーControlとAlt、およびF11/F12です。これらのキーは元のキーボードにはありませんでした。テンキーでカーソルを動かしました。かつてテンキーは灰色で他のキーはベージュだったので、灰色のキーへの言及はテンキーへの言及です。

Esc 1   0x1
1 or !  2   0x2
2 or @  3   0x3
3 or #  4   0x4
4 or $  5   0x5
5 or %  6   0x6
6 or ^  7   0x7
7 or &  8   0x8
8 or *  9   0x9
9 or (  10  0xa
0 or )  11  0xb
- or _  12  0xc
= or +  13  0xd
Bksp    14  0xe
Tab 15  0xf
Q   16  0x10
W   17  0x11
E   18  0x12
R   19  0x13
T   20  0x14
Y   21  0x15
U   22  0x16
I   23  0x17
O   24  0x18
P   25  0x19
[ or {  26  0x1a
] or }  27  0x1b
Enter   28  0x1c
Left Ctrl   29  0x1d
A   30  0x1e
S   31  0x1f
D   32  0x20
F   33  0x21
G   34  0x22
H   35  0x23
J   36  0x24
K   37  0x25
L   38  0x26
; or :  39  0x27
' or "  40  0x28
` or ~  41  0x29
Left Shift  42  0x2a
\ or |  43  0x2b
Z   44  0x2c
X   45  0x2d
C   46  0x2e
V   47  0x2f
B   48  0x30
N   49  0x31
M   50  0x32
, or <  51  0x33
. or >  52  0x34
/ or ?  53  0x35
Right Shift 54  0x36
Prtsc
This is a special case  55  0x37
Left Alt    56  0x38
Space   57  0x39
Caps Lock   58  0x3a
F1  59  0x3b
F2  60  0x3c
F3  61  0x3d
F4  62  0x3e
F5  63  0x3f
F6  64  0x40
F7  65  0x41
F8  66  0x42
F9  67  0x43
F10 68  0x44
Num Lock    69  0x45
Scroll Lock 70  0x46
Home (Number Pad)   71  0x47
Up Arrow (Number Pad)   72  0x48
Pgup (Number Pad)   73  0x49
Grey - (Number Pad) 74  0x4a
Left Arrow (Number Pad) 75  0x4b
Center (The 5 key on the number pad?)   76  0x4c
Right Arrow (Number Pad)    77  0x4d
Grey + (Number Pad) 78  0x4e
End (Number Pad)    79  0x4f
Down Arrow (Number Pad) 80  0x50
Pgdn (Number Pad)   81  0x51
Ins (Number Pad)    82  0x52
Del (Number Pad)    83  0x53
Enter (Number Pad)  57372   0xe01c
Right Ctrl  57373   0xe01d
Grey / (Number Pad) 57397   0xe035
Right Alt   57400   0xe038
Home    57415   0xe047
Up Arrow    57416   0xe048
Pgup    57417   0xe049
Left Arrow  57419   0xe04b
Right Arrow 57421   0xe04d
End 57423   0xe04f
Down Arrow  57424   0xe050
Pgdn    57425   0xe051
Ins 57426   0xe052
Del 57427   0xe053
F11 57431   0xe057
F12 57432   0xe058
Left Winkey 57435   0xe05b
Right Winkey    57436   0xe05c

注:プログラムは16ビット値を使用して、正の数(0〜65 536)または正と負の数(-32 768〜32 787)を表します。リスト内のより大きな数については、他のほとんどのプログラムがそれらを扱う可能性が高いため、符号なし整数であると想定しました。一部のプログラミング言語は、符号付き整数のみをサポートします。変換するには、65536から表の数値を引き、それを負にします。例えば。右ウィンキーは57436です。65536-57436= 8100の場合、負の値-8100になります。

これらのコードはDosからのものであるため、MS-Dosは16ビットであったため、整数と呼びます。ただし、整数はプロセッササイズに等しいため、Windowsの整数は32ビット(約0〜40億または-20億〜20億)です。

2
Mark