生入力の概要
従来のキーボードとマウスの横には、多くのユーザー入力デバイスがあります。 たとえば、ユーザー入力は、ジョイスティック、タッチスクリーン、マイク、またはユーザー入力の柔軟性を高めるその他のデバイスから取得できます。 これらのデバイスは、総称してヒューマン インターフェイス デバイス (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 はデバイスに固有の生の低レベルのデータを送信します。
未加工入力の登録
既定では、生の入力を受け取るアプリケーションはありません。 デバイスから生の入力を受信するには、アプリケーションでデバイスを登録する必要があります。
デバイスを登録するために、アプリケーションは最初に RAWINPUTDEVICE 構造体の配列を作成し、必要なデバイスの 最上位コレクション (TLC) を指定します。 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 )。 アプリケーションは、フォアグラウンドの場合とバックグラウンドでデータを受信できます。
生データを読み取る方法は 2 つあります。バッファーなし (または標準) メソッドとバッファー処理されたメソッドです。 バッファーなしメソッドは、生データを一度に 1 つの RAWINPUT 構造体で取得し、多くの HID に適しています。 ここでは、アプリケーションは GetMessage を 呼び出して 、WM_INPUT メッセージを取得します。 その後、アプリケーションは、WM_INPUTに含まれる RAWINPUT ハンドルを使用して GetRawInputData を呼び出します。 例については、「 生入力の標準読み取りの実行」を参照してください。
これに対し、バッファーに格納されたメソッドは、一度に RAWINPUT 構造体の配列を取得します。 これは、大量の生入力を生成できるデバイスに提供されます。 このメソッドでは、アプリケーションは GetRawInputBuffer を呼び出して RAWINPUT 構造体の配列を取得します。 NEXTRAWINPUTBLOCK マクロは、RAWINPUT 構造体の配列を走査するために使用されることに注意してください。 例については、「 生入力のバッファー読み取りの実行」を参照してください。
生の入力を解釈するには、HID に関する詳細情報が必要です。 アプリケーションは、デバイス ハンドルを使用して GetRawInputDeviceInfo を 呼び出して、デバイス情報を取得します。 このハンドルは、WM_INPUTまたは RAWINPUTHEADER の hDevice メンバーから取得できます。