筆者は、一日中、PCのキーボードを叩いて生活している。このキーボード、プログラミングや文書作成など、最も使われる周辺機器、あるいは入力装置といえる。打鍵量の多い人にとって、キーボードの良し悪しは、作業効率に影響する。こうしたなか、最近では、高級なキーボードも増えてきた、安価なものが1,000円しないで入手可能なことを考えると、その10倍以上するキーボードに価値を見いだす人がいるということだ。こうした高級キーボードの行き着く先に、自分でキーボードをデザインする自作キーボードあるいはカスタマイズキーボードがある。とはいえ、普通のキーボードでもプラットフォーム側の機能を利用するとある程度のカスタマイズは可能だ。

  • 窓辺の小石

一般にキーを押したときに何が起こるのかを変更することをキーボードの「再マッピング」という。

Windowsでは、いくつかの「介入点」が存在するため、キーボードのカスタマイズは比較的容易だ。こうした処理を行うユーティリティソフトウェアもフリーソフトなどで容易に入手できる。また、LinuxでもX Windowsの仕組みなどを使うことで再マッピングが可能な場合が多い。

PCのキーボードは、キーを押したときと離したときに、準拠する配列に応じて「スキャンコード」を出力する。OS側では、準拠する配列に応じてこのスキャンコードを解釈し「仮想キーコード」に変換する。アプリケーション側は、キーボードが押されたというメッセージやイベントを直接処理してもいいし、テキストコントロールなどWindowsが提供するGUI部品で文字入力として処理させてもよい。

この処理の間で、キーボードの再マッピングが可能なポイントが3つある。1つは、キーボードの配列を処理する「キーボードレイアウト」処理、2つめはスキャンコードの置き換え処理、3つめはキーボードメッセージの書き換え処理である。さらに、日本語環境の場合、IMEのキーボードカスタマイズがあり、アプリケーションによっては、自身が利用するキーボードショートカットやホットキーの変更が可能だ。

Windowsのキーボード再マッピング機能

PCの101キーボードと106キーボードでは、同じ位置にあるキーを押したときに同じ「スキャンコード」が出力される(日本語関連キーを除く)。Windowsは、これをキーボードレイアウトDLLというプログラムモジュールで適切なものに解釈する。現在の日本語版Windows 10では、「KBD106.DLL」が指定されているが、そのほかに「106 Ctrl+英数」(KBD106n.DLL)、「AXキーボード」(KBDAX2.DLL)などがある。前者は「カタカナ/ひらがな」キーをCtrl+英数(Caps Lockキー)で代用するもの。後者は、かつて存在したIBM PC/ATの日本語化仕様AXで作られたキーボード配列だ。基本の配列が101キーで日本語キーを4つ追加したため、105キーボードなどと呼ばれることがある。101キーボードと記号類の配置が同じ(たとえば、Shift+2で@が出る)で、米国101キーボードに慣れた人には人気があった。キーボードレイアウトDLLは、レジストリで指定されているため、書き換えて別のDLLを指定することも可能だ(図01)。こうすることで、たとえば、106キーボードを強制的にAXキーボードにして配列を変更することができる。ただし、KDBAX2.DLLは、Windowsキーをサポートしていないなど、本格的に使う場合には、後述の再マッピングアプリケーションなどでカスタマイズが必要になる。

  • 図1: キーボード配列は、レジストリで設定されているため、これを変更することで物理キーの配列と無関係に配列を変更できる

キーボードから送られてきたスキャンコードは、Windowsの仮想キーコード(Virtual-Keyコード。VKとも)に変換される。仮想キーコードは、左右のコントロールキーなど、キー1つ1つを区別できるキーコードだ。言語により対応する文字が異なるキー(たとえばLの右隣のセミコロンキー)は、VKOEM1という仮想キーコードに変換され、このあと、各言語の配列やシフト状態によって文字コードに変換される。この仮想キーコードに関しては、Microsoftの以下のページに記述がある。

Virtual-Key コード
https://docs.microsoft.com/ja-jp/windows/win32/inputdev/virtual-key-codes

仮想キーコードに対して、Windowsはレジストリによる再マッピング機能を提供している(図02)。複数の設定が可能なので、大規模なカスタマイズも可能だが、レジストリ変更後に再起動する必要があり、Windowsの利用中に気軽に変更できるものではない。しかし、物理的には同一でもWindows側の状態により挙動が異なる「Caps Lock」と「英数」などのキーの入れ替えにも対応が可能といったメリットがある。具体的には、レジストリに置き換え元と置き換え先の仮想キーコード(各16bit値)を組み合わせたマッピング値を作り、その数などを付け加えてScanMapという名前のバイナリ値に設定する。

  • 図2: キーボードのスキャンコードは、Windowsの仮想キーコードに変換されるが、その後、レジストリの設定値で仮想キーコードの置き換えを行うことができる

さらにWindowsのキーボードメッセージ(あるいはキーボードイベント)が発生する前段階でWindowsはソフトウェアを介入させることができる(図03)。この機能をKeyboard Hookという。これを利用するには、プログラムを書く必要がある。フリーソフトなどのキーボード再マッピングアプリケーションの多くは、このKeyboard Hookを利用するもの。

  • 図3: WindowsのKeyboard Hook APIを使うと、アプリケーションにキーボードメッセージやイベントが渡される前にアプリケーションによる処理が可能になる

キーボード再マップアプリケーションは、いくつもあるが、ここでは、MicrosoftのPowerToys(図04)を取り上げておこう。PowerToysは、Microsoftがオープンソースで開発しているユーティリティアプリケーションで、複数の機能を持つ。そのうちの1つにキーの再マッピング機能をもつ「Keyboard Manager」がある。

  • 図4: PowerToysのKeyboard Managerは、キーボード再マッピング機能を持ち、単独キーを置き換える「キーの再マップ」と複数キーの同時押しとなる「ショートカット」を置き換える機能を持つ

Keyboard Managerは、「キーの再マップ」と「ショートカットの再マップ」という2つの機能がある。前者は、キートップを別のキー(物理キーボードにはなくてもよい)に仮想キーコードのレベルで置き換えを行うもの。後者は、コントロールキーやシフトキーなどを併用する複数キーの同時押しである「ショートカット」を別のショートカットに割り当て直すもの。こちらは、対象となるアプリケーションを限定できる。筆者は、キーの再マップを使って、使っていない「カタカナ/ひらがな」キーを、PrintScreenに置き換え、画面キャプチャーを簡単に行えるようにした。ショートカットの再マップでは、Win+JとWin+NをHome、Endキーに割り当てている(小指でWinキーを押せば、エディタなどで行の前後に移動するとき、ホームポジションから手を離さないで済む)。

なお、日本語IMEも一般的に利用するキーボードショートカットを再マップする機能を持つ。「C:\Windows\System32\IME\IMEJP\IMJPUEX.EXE」を起動するとIMEの詳細設定ダイアログが開き、「全般タグ ⇒ 編集操作」にある「キー設定」でキーボードショートカットの設定タイプを切り替えることができ、「変更」ボタンで、キーと機能の対応を設定するダイアログボックスが開く。IMEのキーボードショートカットは、日本語入力時に利用頻度が高いため、押しやすく、アプリケーション動作の妨げにならない組み合わせをみつけると使いやすくなる。

キーボードのカスタマイズは、キーロガーがインストールされやすくなるなどのセキュリティ的なリスクもあり、スマートフォンやタブレットなどのプラットフォームでは、キーボードの再マッピングは不可能ではないものの困難だったり、制限があるものが多く、OS自身も再マッピングに関しては、わずかな機能しか提供していない。このため、基本的には、プラットフォームで定めたキーマッピングを使うしかない。しかし、一部のキーボードハードウェアは、再マッピングの機能を持っていることがある。中には、複数の配列を記憶して切り替えて利用できるものもある。スマートフォンなどWindows以外のプラットフォームでは、こうしたキーボードを併用することで快適なキーボードマッピングを実現できる可能性がある。