PCのキーボードは、現在に至るまでのベースとなったIBM PCの頃から大きく変わっていない。いまだにPS/2コネクタを持つマザーボードも存在し、変換コネクタを使うと当時のIBM PCのキーボードを接続して利用できる。
一方で今の時代は、USBやBluetoothといった接続方式を使うキーボードも存在する。あらためてWindowsのキーボードはどうなっているのかを見ていく。今回はユーザーがキーボードを押してから、アプリケーションにそれが通知されるまでを概観する。各所に細かい話はあるのだが、なるべく全体を見るようにしたい。

Windowsのキーボード入力の仕組み。USB/BluetoothでPS/2の大きく2つのハードウェアに分けられ、双方が押されたキーをWindowsスキャンコードで表現して、kbdclass.sysで処理する。この時点では、どのキーも単なるコードでしかないが、その後、レイアウトDLLを使い、仮想キーコードに変換されるとき、言語、キー固有の処理がされる
キーボードのハードウェアは
大きくPS/2とUSBで仕組みが分けられる
まず物理的なキーボードだが、現在では大きく2つに分けることができる。それは、USBキーボードとPS/2キーボードだ。この2つはハードウェアが違うし、キーの表現方法も違う。USBキーボードは、USB HID(Human Interface Device)であり、レポートという形式でキーの状態を報告する。
キーボードのレポートでは、その時点で押されているキーをすべて列挙するだけで、Ctrl/Shift/Altといった「修飾」キーの処理は、すべてソフトウェア側に任されている。また、BluetoothキーボードはUSB HIDの定義を利用しており、コントローラーや伝送プロトコルは違っていても、同じHIDレポートを送信するようになっている。
PS/2キーボードは、IBMのPS/2シリーズで採用されたキーボードのインターフェースである。端子自体には違いはあるが、基本的には初代のIBM PC~PC/ATまでとほぼ同等で、変換コネクタ経由で基本そのまま使える。ここでは、初代IBM PCからのPCキーボードとPS/2キーボードをまとめて「PS/2キーボード」と総称する。
PS/2キーボードは、キーボードユニットとPC本体がケーブルでつながっており、その間の信号線を少なくするため、信号をシリアル伝送。キーボード側、PC側にそれぞれコントローラー(1チップマイコン)が存在する。キーボードケーブルの信号線は双方向で、PC側からキーボードにコマンドを送って設定を変更できる。このとき、キーボードケーブルを流れるコマンドで押されたキーを通知する。このキーの表現を「スキャンコード」という。
ただし、キーボードのスキャンコードは広い意味があり、たとえば、その定義の一部をWindowsが利用している。そこでキーボードから送られるスキャンコードを「メーク/ブレーク(スキャン)コード」などとして区別することがある。メーク/ブレークは、キーが押された/離された、という2つの状態を示す言葉。電子回路のスイッチが「つながった」「離れた」を意味する英語である。この「メーク/ブレークコード」は、キーが押されたとき、離されたときにそれを示すコードが送られる。
このスキャンコードには大きく3種類がある。それぞれ、Scan Code Set 1/Set2/Set3と呼ばれている。Set 1は、初代IBM PCからPC XTのIBM PCキーボード(86キーボードやXTキーボードなどと呼ばれる)まで使われていたもの。Set 2は、IBM PC/ATの拡張キーボード(Enchanded Keyboard、101キーボードなどとも)で採用されたスキャンコード、Set 3はPS/2で採用されたスキャンコードだ。現在の標準はSet2。仕様上、PCからキーボードにコマンドを送ってScan Code Setを切り替えることができるようになっているが、他のSetに切り替えができるかどうかはキーボード次第で、Set2が出力できれば、Windowsの利用は問題ない(はず)。
PS/2キーボードの特殊なものとして、ラップトップなどの内蔵キーボードがある。基本的には、PS/2キーボードと同じなのだが、分離されることがないため、「組み込みコントローラー」と呼ばれる部品でキーマトリクスのスキャンとスキャンコードの出力するようになっているものが多い。
キーボードのレイアウトを
ハード的に判別できないのでOS側が管理する
キーボードには国際化のために多数のバリエーションがある。日本語では、106キーと呼ばれるタイプ(OADGで定義したことからOADGキーボードと呼ばれることもある)が普及し、これは101キーに対して、変換/無変換/カタカナ・ひらがな(俗に言うカナキー)などの5キーを追加したもの(全角/半角キーは101のチルダキーを利用しているため含まれない)。今はWindowsロゴキー(正式には左右2つ)やメニューキーも標準的に搭載されるため、109/108キーが標準的だ。
スキャンコードは、86キー、101キーのキートップをベースにキーに番号を割り当てたものだ。元々はキートップ文字に対応していたが、国際化の過程でキーそのものを区別するコードになり、OS側で、キーボードのレイアウト(キートップの並び、どのキーを押したらどんな文字や機能になるのかということ)を定めて、スキャンコードを文字コードなどに変換している。
こうしたバリエーションについては、キーボードからは2バイトのIDを返す仕組みには一応なっているのだが、IBM PC/ATのハードウェアが互換機として普及していく過程でID割り当てを誰も管理しなかったため、すべてのキーボードを明確に区別することが困難になった。
そこでキーレイアウトに関しては、OS側で面倒を見ることになっている。USBキーボードは、デバイスに関する情報を返す機能を持っており、メーカー名やキーボード名を取得し、これを使ってレイアウトを判別することは可能なのだが、OS側でレイアウトを管理していることから、これに従うことになっている。昔からのユーザーは、ときどきWindowsやデバイスドライバーのバグなどで、日本語キーボードが英語版配列になった経験をお持ちの方もいるだろう。これはソフトウェアだけでレイアウトを指定しているからである。
Scan Codeは、キーを押したときに発生するメークコードとキーを離したときに発生するブレークコードからなる。セットによりブレークコードの表現が違い、Set 1は上位ビットを1にし、Set 2、Set 3は、メークコードの前に0xF0(16進数)を付ける。左右に同じキーがある場合、片方には、0xE0を付けどちらのキーが押されたのかを区別する。このため、アプリケーションで利用するショートカットなどでは、左右にあるAltキーやCtrlキーを区別するものがある。

この連載の記事
-
第470回
PC
Windows用のパッケージマネージャー「Winget」 プレビュー版で機能が充実してきた -
第469回
PC
Windows Updateの27年 悪役だった頃から改良が進んで、徐々に目立たない存在に -
第468回
PC
2025年のWindowsどうなる!? Windows Insider Programの状況をあらためて見る -
第467回
PC
Copilot+ PCのNPUでカメラを処理する「Windows Studio Effects」 その内容や効果は? -
第466回
PC
PowerToysの最近の新機能には、複数アプリを指定位置に起動する「ワークスペース」や新規作成のカスタマイズがある -
第465回
PC
WindowsのPowerShellからBluetoothデバイスを調べる -
第464回
PC
Windows 10のサポート切れまで1年を切った さてWindows 10マシンをどうする? -
第463回
PC
Windows Terminal Preview版でSixelグラフィックスを実際に表示させてみる -
第462回
PC
Windows Terminal Preview版でSixelグラフィックスを扱う -
第461回
PC
Copilot+ PCを買ってみたが、「今焦って買う必要はない」のかもしれない -
第460回
PC
Windowsでsftpを使う - この連載の一覧へ