キーボードドライバーでの
キー入れ替え処理はレジストリで可能
ハードウェアにより、違いがあるものの、マザーボード側に伝えられたメーク/ブレークのスキャンコードは、Windowsのデバイスドライバーが扱い、最終的に「kbdclass.sys」というキーボードドライバーに伝わる。
ここでは、すべてのキーはWindowsスキャンコードで表現される。Windowsスキャンコードは、Scan Code Set 1のメークコードを利用したもので、どのキーが押されたのかを示す。なお、キーボードのScan Code Set 1は、最上位ビットを立ててメークとブレークを区別していたため、メークコードの範囲は0x01~0x7Fまでだったが、Windowsスキャンコードでは、メーク、ブレークは別の情報として扱うため、範囲を広げ8bitすべて(0xFFまで)を利用している。
これにより、101キーボード以後に追加されたさまざまなキーも固有のスキャンコードを持つことができるようになっている。USBキーボードは、スキャンコードを発生させないが、HIDレポートをスキャンコードに変換し、以後の処理は同じkbdclass.sysで扱う。
最終的には、Windowsスキャンコードは、Windowsの定義する「仮想キーコード」に変換され、キーを押した(WM_KEYDOWNイベント)、キーを離した(WM_KEYUPイベント)というイベントが発生する。それぞれが別々のイベントなので、Windowsスキャンコードは、メークコードのみが使われるわけだ。
イベントを利用するか、文字だけを受け取るのかは、アプリケーション次第である。WindowsのAPIには、さまざまなキー入力のためのAPIがある。また、Win32APIでは、イベントを発生させる前段階に割り込むことができるキーボードフックと呼ばれるAPIがある。これを利用することでキーの差し替えなども可能なのだが、後述する仮想キーコードとのマッピングがなされた後なので、処理がちょっと複雑である。
これに対して、kbdclass.sys側で行われるキーの入れ替え処理は比較的単純だ。レジストリ「HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout」の「Scancode Map」に入れ替えたいキーのWindowsスキャンコードを記述しておけば、任意のキーを再割り当てできる。これは、キーのレイアウト処理の前なので、物理的なキーの段階で入れ替えができるからだ。キーボードフックの段階でキーの入れ替えが面倒なのは、レイアウトによって、キーの挙動が変わるからだ。
Windowsスキャンコードを仮想キーコードに変換するときに使われるのが、キーボードレイアウトDLL「kbdxxx.dll」というファイルだ。このDLLの中にWindowsスキャンコードを仮想キーコードに変換するための変換テーブルなどが含まれている。著名なものにAXキーボード用のkbdax2.dllがある。
AXキーボードは、101キーの英語配列をベースに日本語化したもので、アルファベットや記号類の配置が英語キーボードと同じで、そこに日本語用にキーが追加されているという特徴を持つ。一時は日本語版WindowsとAXキーボード(105キーボードなどとも呼ばれた)の組み合わせが流行っていた。というのも、AX以前は米国仕様のPC互換機のみだったため、多くのユーザーは101準拠のキーボードを使っており、その配列になれていたからだ。また、IMEオン/オフ用の「漢字」キーがスペースバーと同じ段にあり、今の「全角/半角」キーよりも押しやすかった。AXキーボードはすでに入手困難で利用者が増えることはなさそうだが、kbdax2.dllはいまだにWindows 10にも含まれており、今でも使えるはずだ。
筆者も、昔はアルプス製のAXキーボードを複数確保し「これで一生大丈夫」と思っていたが、フルサイズが我慢できず、テンキーのないREALFORCEに乗り替えたため、一般的なキーレイアウトになった。一番に不便に感じるのは、記号類を多用するプログラムを書く場合。日本語入力は親指シフトなので、初期のREALFORCEシリーズのようにスペースキーの短いレイアウトは好ましかった。しかし、第2世代になったREALFORCEでは変換キーが右にずれてしまったため、もう筆者の指には合わなくなってしまった。ということで、次はどのキーボードを選ぶかを考えているところ。キーボードは単純なデバイスではあるが、1日中使うものなので、ちょっとした違いも許容できず、いつも悩みのタネである。
この連載の記事
-
第457回
PC
IPv6アドレスは先頭を見ればどんな種類かわかる -
第456回
PC
あらためてIPv6基本のキ -
第455回
PC
Windowsで現在どのネットワークアダプタがインターネット接続に使われているかを調べる方法 -
第454回
PC
Windows 11 24H2では「デバイスの暗号化」の条件が変わり、より多くのPCでドライブが暗号化される -
第453回
PC
Windows 11 24H2の配布開始後もすぐにはやってこない Windows UpdateとSafeguard Holds -
第452回
PC
Windows 11 Ver.24H2が登場 Copilot+ PCとそうでないPCで実質Windowsが2つに分かれる -
第451回
PC
新しいWindowsサンドボックスではコマンドラインからの制御が可能に -
第450回
PC
ユニコードで文字数を数える方法 -
第449回
PC
WSLはプレビュー版でGUIでの設定が加わった! リリース2.3.xの新機能を見る -
第448回
PC
PowerShellで面倒なオブジェクトはPSCustomObjectに変換するのが早道 -
第447回
PC
この秋登場のWindows 11の新バージョン、Ver.24H2の状況を見る - この連載の一覧へ