Microsoft DirectX 8.0 (C++)

DirectInput デバイスの列挙

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 によるデバイス列挙の詳細については、「アクション マッピング」を参照すること。