従来のキーボードとマウスの横には、多くのユーザー入力デバイスがあります。 たとえば、ユーザー入力は、ジョイスティック、タッチ スクリーン、マイク、またはユーザー入力の優れた柔軟性を可能にするその他のデバイスから取得できます。 これらのデバイスは、ヒューマン インターフェイス デバイス (HID) と総称されます。 生入力 API は、キーボードやマウスなど、任意の HID からの生の入力をアプリケーションが受け入れるための安定した堅牢な方法を提供します。
このセクションは、次のトピックで構成されています。
生入力モデル
以前は、キーボードとマウスは通常、入力データを生成しました。 システムは、生の情報のデバイス固有の詳細を排除する方法で、これらのデバイスからのデータを解釈しました。 たとえば、キーボードはデバイス固有のスキャン コードを生成しますが、システムはアプリケーションに仮想キー コードを提供します。 未加工の入力の詳細を非表示にするだけでなく、ウィンドウ マネージャーはすべての新しい HID をサポートしませんでした。 サポートされていない HID から入力を取得するには、アプリケーションで多くのことを行う必要がありました。デバイスを開く、共有モードを管理する、デバイスを定期的に読み取る、I/O 完了ポートを設定するなどです。 生入力モデルと関連する API は、キーボードやマウスを含むすべての入力デバイスから生入力に簡単にアクセスできるように開発されました。
生の入力モデルは、キーボードとマウスの元の Windows 入力モデルとは異なります。 元の入力モデルでは、アプリケーションは、WM_CHAR、WM_MOUSEMOVE、WM_APPCOMMANDなど、ウィンドウに送信または送信されるメッセージの形式でデバイスに依存しない入力を受け取ります。 これに対し、生入力の場合、アプリケーションはデータを取得するデバイスを登録する必要があります。 また、アプリケーションは、 WM_INPUT メッセージを介して生の入力を取得します。
生入力モデルにはいくつかの利点があります。
- アプリケーションは、入力デバイスを検出または開く必要はありません。
- アプリケーションはデバイスから直接データを取得し、そのニーズに合わせてデータを処理します。
- アプリケーションは、入力のソースが同じ種類のデバイスの場合でも区別できます。 たとえば、2 つのマウス デバイスです。
- アプリケーションは、デバイスのコレクションからのデータまたは特定のデバイスの種類のみを指定して、データ トラフィックを管理します。
- HID デバイスは、新しいメッセージの種類や更新された OS がWM_APPCOMMANDで新しいコマンドを使用するのを待たずに、マーケット プレースで使用可能になったときに使用できます。
WM_APPCOMMANDは、一部の HID デバイスに対して提供されることに注意してください。 ただし、 WM_APPCOMMAND はデバイスに依存しない高レベルの入力イベントですが、 WM_INPUT はデバイスに固有の生の低レベルのデータを送信します。
生入力の登録
既定では、生の入力を受け取るアプリケーションはありません。 デバイスから生の入力を受信するには、アプリケーションでデバイスを登録する必要があります。
デバイスを登録するために、アプリケーションはまず、必要なデバイスの最上位レベルのコレクション (TLC) を指定する RAWINPUTDEVICE 構造体の配列を作成します。 TLC は 、使用状況ページ (デバイスのクラス) と 使用状況 ID (クラス内のデバイス) によって定義されます。 たとえば、キーボード TLC を取得するには、UsagePage = 0x01、UsageID = 0x06 を設定します。 アプリケーションは RegisterRawInputDevices を呼び出してデバイスを登録します。
アプリケーションは、現在システムに接続されていないデバイスを登録できることに注意してください。 このデバイスが接続されると、Windows マネージャーは自動的に生の入力をアプリケーションに送信します。 システム上の生入力デバイスの一覧を取得するために、アプリケーションは GetRawInputDeviceList を呼び出します。 この呼び出しから hDevice を使用して、アプリケーションは GetRawInputDeviceInfo を呼び出してデバイス情報を取得します。
RAWINPUTDEVICE の dwFlags メンバーを使用して、アプリケーションはリッスンするデバイスと、無視するデバイスを選択できます。 たとえば、アプリケーションは、応答マシンを除くすべてのテレフォニー デバイスからの入力を要求できます。 サンプル コードについては、「 生入力の登録」を参照してください。
マウスとキーボードも HID であるため、 HID メッセージWM_INPUT と従来のメッセージの両方を介してデータを取得できることに注意してください。 アプリケーションでは、 RAWINPUTDEVICE で適切なフラグを選択することで、いずれかのメソッドを選択できます。
アプリケーションの登録状態を取得するには、 GetRegisteredRawInputDevices をいつでも呼び出します。
生入力の読み取り
アプリケーションは、 最上位レベルのコレクション (TLC) が登録の TLC と一致する HID から生の入力を受け取ります。 アプリケーションが生の入力を受信すると、そのメッセージ キューは WM_INPUT メッセージを取得し、キューの状態フラグ QS_RAWINPUT が設定されます (QS_INPUTにもこのフラグが 含まれます)。 アプリケーションは、フォアグラウンドとバックグラウンド ( RIDEV_INPUTSINK に登録されている場合) にデータを受信できます。
生データを読み取る方法は 2 つあります。標準メソッドとバッファーメソッドです。
標準メソッド は一度に 1 つの RAWINPUT 構造体を読み取り、ほとんどのデバイスに適しています。 アプリケーションは GetMessage を呼び出してWM_INPUT メッセージを取得した後、lParam で渡された HRAWINPUT ハンドルを使用して GetRawInputData を呼び出します。 例については、「 生入力の標準読み取りの実行」を参照してください。
バッファー処理されたメソッド は一度に RAWINPUT 構造体の配列を読み取り、1000Hz のマウスなどの高周波デバイスに役立ちます。このデバイスでは、メッセージ ループの反復の間に複数のイベントが蓄積される可能性があります。 アプリケーションは GetRawInputBuffer を呼び出して、蓄積されたすべてのイベントを 1 つのバッチでドレインします。 NEXTRAWINPUTBLOCK マクロを使用して、結果の配列を走査します。
Important
GetMessage は、返す前に、現在の WM_INPUT を生入力キューから削除します。 その結果、 GetRawInputBuffer には現在のイベントは表示されず、その後に到着したイベントのみが表示されます。 両方のメソッドを組み合わせると、正しいパターンは次のようになります。
- 現在のイベントを読み取るには、lParam ハンドルを使用して GetRawInputData を呼び出します。
- ループで GetRawInputBuffer を呼び出して、キューに蓄積された追加のイベントをドレインします。
例については、「 生入力のバッチ読み取りの実行」を参照してください。
生入力を解釈するには、HID に関する詳細情報が必要になる場合があります。 アプリケーションは、デバイス ハンドルを使用して GetRawInputDeviceInfo を 呼び出すことによって、デバイス情報を取得します。 このハンドルは、WM_INPUT の lParam にある GetRawInputData を使用して RID_HEADER から取得することも、RAWINPUTHEADER の hDevice メンバーから取得することもできます。