Microsoft DirectX 8.0 (C++) |
Microsoft® DirectInput® は、すべての使用可能な入力デバイスをシステムに問い合わせ、それらが接続されているかどうかを判定し、それらのデバイスに関する情報を返すことができる。このプロセスを列挙と呼ぶ。
標準のキーボードやマウス、またはその両方だけをアプリケーションで使っているなら、使用可能な入力デバイスを列挙する必要はない。「DirectInput デバイスの作成」で説明するように、IDirectInput8::CreateDevice メソッドを呼び出すときは、事前定義されたグローバル変数を使用できる。
ほかのすべての入力デバイス、および複数のキーボードまたはマウスを使用するシステムに関しては、IDirectInput8::EnumDevices および IDirectInput8::EnumDevicesBySemantics を呼び出して、使用可能なデバイスを列挙し、適切なデバイスを選択することができる。また、列挙して、使用可能なデバイスをユーザーが選択できるようにすることもできる。
以下は、IDirectInput8::EnumDevices メソッド実装の例である。
/* lpdi は、有効な IDirectInput8 インターフェイス ポインタである。 */ GUID KeyboardGUID = GUID_SysKeyboard; lpdi->EnumDevices(DIDEVTYPE_KEYBOARD, DIEnumDevicesCallback, &KeyboardGUID, DIEDFL_ATTACHEDONLY);
1 番目のパラメータは、列挙すべきデバイスのタイプを指定する。タイプに関係なくすべてのデバイスを列挙したければ、NULL とする。それ以外は、DIDEVICEINSTANCE に説明のある DIDEVTYPE_* 値の 1 つを指定する。
2 番目のパラメータは、列挙された各デバイスに対して一度ずつ呼び出されるコールバック関数へのポインタである。この関数は、どのような名前でもよいが、ここではプレースホルダ名の DIEnumDevicesCallback を使用する。
EnumDevices メソッドの 3 番目のパラメータは、コールバック関数に渡す任意の 32 ビットの値である。この例では、GUID 型の変数へのポインタであり、コールバック関数がこの変数へのキーボード インスタンス識別子を割り当てることができるように渡される。
4 番目のパラメータは、列挙対象が全デバイスか、またはアタッチされているデバイスのみ (DIEDFL_ALLDEVICES または DIEDFL_ATTACHEDONLY) かを指定するフラグである。
アプリケーションが複数の入力デバイスを使用している場合、列挙されたとおりにデバイスを初期化するには、コールバック関数を使用するのが適している (例については、「チュートリアル 3 : ジョイスティックの使い方」を参照すること)。デバイスのインスタンス GUID をコールバック関数から取得する。ここでは、デバイスの特定のサブタイプを検索したり、デバイス名をリストボックスに追加したりするなど、別の処理を実行することもできる。
以下のコードは、拡張キーボードの存在をチェックし、見つかったら列挙を停止するコードの例である。見つかったキーボードのインスタンス GUID を KeyboardGUID 変数 (前の例の EnumDevices の呼び出しで pvRef として渡される) に割り当てる。この変数は、次に IDirectInput8::CreateDevice を呼び出す際に使用できる。
BOOL hasEnhanced; BOOL CALLBACK DIEnumKbdCallback(LPCDIDEVICEINSTANCE lpddi, LPVOID pvRef) { *(GUID*) pvRef = lpddi->guidInstance; if (GET_DIDEVICE_SUBTYPE(lpddi->dwDevType) == DIDEVTYPEKEYBOARD_PCENH) { hasEnhanced = TRUE; return DIENUM_STOP; } return DIENUM_CONTINUE; } // コールバックの終了。
1 番目のパラメータは、デバイスの情報を格納する DIDEVICEINSTANCE 構造体を指す。この構造体は、DirectInput が自動的に作成する。
2 番目のパラメータは、EnumDevices から渡されたデータを指す。この場合は、変数 KeyboardGUID へのポインタである。この変数には当初、デフォルト値が割り当てられているが、デバイスが列挙されるたびに、新しい値が割り当てられる。単一のキーボードに対してどのインスタンス GUID を使用するかは実際には重要でないが、上記のコードは、コールバック関数からインスタンス GUID を取得する技法を具体的に示している。
インスタンス GUID を保存して、後で DirectInputDevice を作成できるようにするのではなく、列挙中に DirectInput によって作成されたデバイスを保存できる。詳細については、「DirectInput デバイスの作成」を参照すること。
この場合の戻り値は、検索対象のデバイスが見つかれば列挙を停止し、そうでなければ続行することを示す。列挙は、全デバイスの列挙が終了すると直ちに自動的に停止する。
IDirectInput8::EnumDevicesBySemantics によるデバイス列挙の詳細については、「アクション マッピング」を参照すること。