Windowsにおいてマウスとキーボードのリアルタイム入力を行なう方法は複数存在しますが、通常のWindowsメッセージおよびGetASyncKeyState, GetKeyState API等では、複数の入力デバイスを識別することは出来ず、全て混合された入力としてのみ受け取ることになります。
Raw input APIを利用することで、複数の入力デバイスからの入力を識別することが出来るため、マルチプレイヤーゲーム等で有用と考えられます。
WM_INPUT
Raw inputのメッセージはWM_INPUTで受け取ります。しかし、デフォルトではこれを受け取る設定になっていないため、RegisterRawInputDevicesにて設定する必要があります。
RegisterRawInputDevices
WM_INPUTを受け取れるように設定します。
SetWindowSubclass
本来、ウィンドウメッセージを受け取るにはウィンドウプロシージャに手を入れる必要がありますが、ゲームエンジン等のフレームワークを使っている場合、ウィンドウプロシージャが隠蔽されていて手を出せない場合が多々あります。
このような場合には、ウィンドウメッセージの横取りをする必要があり、これを一般にウィンドウのサブクラス化などと呼びます。
SetWindowSubclassはWindowsXP以降で導入された比較的新しいAPIで、ウィンドウのサブクラス化を安全に行うことが出来ます。
Raw inputを使って複数のマウス、キーボードを使用する簡単なデモを作成しました。
RawInput.cpp, RawInput.h
Raw input入力ライブラリ本体
RawInputReceiver.h
上記ライブラリで利用するレシーバのサンプル
RawInputDemo.cpp
複数のマウスとキーボードを利用するサンプル。実際にマウスとキーボードを2台ずつ接続して実行してください。