Platform SDK: DirectX |
DirectInput は、すべての使用可能な入力デバイスをシステムに問い合わせ、それらが接続されているかどうかを判定し、それらのデバイスに関する情報を返すことができる。このプロセスを列挙と呼ぶ。
標準のキーボードやマウス、またはその両方だけをアプリケーションで使っているなら、使用可能な入力デバイスを列挙する必要はない。「DirectInput デバイスの作成」で説明するように、IDirectInput7::CreateDeviceEx メソッドを使用するときは、事前定義されたグローバル変数を使用できる。
ほかのすべての入力デバイス、および複数のキーボードまたはマウスを使用するシステムに関しては、DirectInputDevice オブジェクトを作成できるように、IDirectInput7::EnumDevices を呼び出して、少なくともインスタンス GUID (Globally Unique IDentifier) を取得する必要がある。列挙して、使用可能なデバイスをユーザーが選択できるようにすることもできる。
以下は、IDirectInput7::EnumDevices メソッド実装の例である。
/* lpdi は、有効な IDirectInput7 インターフェイス ポインタである。*/ GUID KeyboardGUID = GUID_SysKeyboard; lpdi->EnumDevices(DIDEVTYPE_KEYBOARD, DIEnumDevicesCallback, &KeyboardGUID, DIEDFL_ATTACHEDONLY);
1 番目のパラメータは、列挙すべきデバイスのタイプを指定する。タイプに関係なくすべてのデバイスを列挙したければ、NULL とする。それ以外は、DIDEVICEINSTANCE のリファレンスに説明のある DIDEVTYPE_* 値の 1 つを指定する。
2 番目のパラメータは、列挙された各デバイスに対して一度ずつ呼び出されるコールバック関数へのポインタである。この関数は、どのような名前でもよいが、ここではプレースホルダ名の DIEnumDevicesCallback を使用する。
EnumDevices メソッドの 3 番目のパラメータは、コールバック関数に渡す任意の 32 ビットの値である。この例では、GUID 型の変数へのポインタであり、コールバック関数がキーボード インスタンス GUID を割り当てることができるように渡される。
4 番目のパラメータは、列挙対象が全デバイスか、またはアタッチされているデバイスのみ (DIEDFL_ALLDEVICES または DIEDFL_ATTACHEDONLY) かを指定するフラグである。
アプリケーションが複数の入力デバイスを使用している場合、列挙されたとおりにデバイスを初期化するには、コールバック関数を使用するのが適している (例については、「チュートリアル 3 : ジョイスティックの使用」を参照すること)。デバイスのインスタンス GUID をコールバック関数から取得する。ここでは、デバイスの特定のサブタイプを検索したり、デバイス名をリストボックスに追加したりするなど、別の処理を実行することもできる。
以下のコードは、拡張キーボードの存在をチェックし、見つかったら列挙を停止するコードの例である。見つかったキーボードのインスタンス GUID を KeyboardGUID 変数 (前の例の EnumDevices の呼び出しで pvRef として渡される) に割り当てる。この変数は、次に IDirectInput7::CreateDeviceEx を呼び出す際に使用できる。
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 番目のパラメータは、デバイスの情報を格納する構造体を指す。この構造体は、DirectInput が自動的に作成する。
2 番目のパラメータは、EnumDevices から渡されたデータを指す。この場合は、変数 KeyboardGUID へのポインタである。この変数には当初、デフォルト値が割り当てられているが、デバイスが列挙されるたびに、新しい値が割り当てられる。単一のキーボードに対してどのインスタンス GUID を使用するかは実際には重要でないが、上記のコードは、コールバック関数からインスタンス GUID を取得する技法を具体的に示している。
この場合の戻り値は、検索対象のデバイスが見つかれば列挙を停止し、そうでなければ続行することを示す。列挙は、全デバイスの列挙が終了すると直ちに自動的に停止する。
標準のキーボードやマウス、またはその両方だけをアプリケーションで使っているなら、使用可能な入力デバイスを列挙する必要はない。「DirectInput デバイスの作成」で説明するように、DirectInput.CreateDevice メソッドを呼び出すときは、事前定義された GUID エイリアスを使用できる。
ほかのすべての入力デバイス、および複数のキーボードまたはマウスを使用するシステムに関しては、DirectInput.GetDIEnumDevices を呼び出して、使用可能なデバイスのコレクションを作成する。このメソッドは、デバイスのコレクションを表す DirectInputEnumDevices オブジェクトを返す。コレクション内の各デバイスは、DirectInputEnumDevices.GetItem メソッドを使用することにより、DirectInputDeviceInstance オブジェクトとして取得できる。
非標準デバイスに対して DirectInputDevice オブジェクトを作成するには、前もって DirectInputDeviceInstance.GetGuidInstance を呼び出すことにより、少なくともそのデバイスの GUID を取得する必要がある。デバイスを列挙して、特定のタイプやサブタイプを検索したり (DirectInputDeviceInstance.GetDevType を使用)、ユーザーがゲーム コントローラを選択できるようにリストボックスに代入したりすることもできる。
特定の能力を持つデバイスを検索することもできる。これを行うには、候補となるデバイスのそれぞれについて DirectInputDevice オブジェクトを作成し、DirectInputDevice.GetCapabilities メソッドを使って詳細機能を調査する必要がある。