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キーを区別するものがある。

この連載の記事
-
第508回
PC
Scalable Vector Graphics(SVG)そもそも何なのか? -
第507回
PC
Windows 11の「開発者モード」とは何か? -
第506回
PC
Windows 11は早くも来秋登場の26H2プレビューの準備が始まる -
第505回
PC
結構変化しているWindows 11のエクスプローラーの基本設定を見直す -
第504回
PC
新しいOutlookとOutlook Classic、そろそろ古いOutlookとExchangeの組み合わせは引退の頃合いか -
第503回
PC
機能が増えたこともあり、寄せ集めから統合化に進むWindowsの便利ツール「PowerToys」 -
第502回
PC
Windows 11でBluetoothのオーディオ新規格「Bluetooth LE Audio」を試す -
第501回
PC
Windows 11 Ver.25H2での変更点、新機能を整理する -
第500回
PC
Windows 11 Ver.25H2が完成した -
第499回
PC
Windowsでの致命的だが回復可能なエラーに備える手段を2つ紹介 -
第498回
PC
Windows Terminalの安定版V1.23が公開 設定UIが改良される - この連載の一覧へ











