次の方法で共有


DirectInput の使い方

DirectInput の使い方

ここでは、Microsoft® DirectX DirectInput® の実装について説明する。以下の説明が含まれる。

  • DirectInput の作成
  • DirectInput デバイスの列挙

より幅広い概要については、「DirectInput について」を参照すること。

詳細については、次のトピックを参照すること。

DirectInput の作成

Microsoft® DirectInput® アプリケーションでは、最初に IDirectInput8 インターフェイスを取得する。これを最も簡単に行う方法は、DirectInput8Create 関数を呼び出すことである。

1 つの Microsoft DirectInput オブジェクトを作成して、アプリケーションが終了するまで解放してはならない。

DirectInput デバイスの列挙

DirectInput は、すべての使用可能な入力デバイスをシステムに問い合わせ、それらが接続されているかどうかを判定し、それらのデバイスに関する情報を返すことができる。このプロセスを列挙と呼ぶ。

標準のキーボード、マウス、またはその両方だけをアプリケーションで使っている場合は、使用可能な入力デバイスを列挙する必要はない。「DirectInput デバイスの作成」で説明するように、IDirectInput8::CreateDevice メソッドを呼び出すときは、事前定義されたグローバル変数を使える。

他のすべての入力デバイス、および複数のキーボードまたはマウスを使うシステムに関しては、IDirectInput8::EnumDevices および IDirectInput8::EnumDevicesBySemantics を呼び出して、使用可能なデバイスを列挙し、適切なデバイスを選択できる。また、列挙して、使用可能なデバイスをユーザーが選択できるようにすることも可能である。

次に、IDirectInput8::EnumDevices メソッドを実装する例を示す。

/* lpdi is a valid IDirectInput8 interface pointer. */

GUID KeyboardGUID = GUID_SysKeyboard; 

lpdi->EnumDevices(DIDEVTYPE_KEYBOARD, 
                  DIEnumDevicesCallback, 
                  &KeyboardGUID, 
DIEDFL_ATTACHEDONLY);

最初の引数は、列挙するデバイスのタイプを指定する。タイプに関係なくすべてのデバイスを列挙する場合は、NULL とする。それ以外の場合は、DIDEVICEINSTANCE で説明している DIDEVTYPE_* 値の 1 つを指定する。

2 番目の引数は、列挙された各デバイスに対して 1 回ずつ呼び出すコールバック関数へのポインタである。この関数は任意の名前で宣言できるが、ここではプレースホルダ名の DIEnumDevicesCallback を使う。

IDirectInput8::EnumDevices メソッドの 3 番目の引数は、コールバック関数に渡す任意の 32 ビットの値である。この例では、グローバル一意識別子 (GUID) 型の変数へのポインタであり、コールバック関数がこの変数にキーボード インスタンス識別子を割り当てられるようにする。

4 番目の引数は、列挙対象がすべてのデバイスか、またはアタッチされているデバイスのみ (DIEDFL_ALLDEVICES または DIEDFL_ATTACHEDONLY) かを指定するフラグである。

アプリケーションが複数の入力デバイスを使っている場合、列挙されたとおりにデバイスを初期化するには、コールバック関数を使うのがよい (例については、「チュートリアル 3 :ジョイスティックの使い方」を参照すること)。デバイスのインスタンス GUID をコールバック関数から取得する。ここでは、デバイスの特定のサブタイプを検索したり、デバイス名をリストボックスに追加したりするなど、別の処理を実行することもできる。

次のコードは、拡張キーボードの存在をチェックし、見つかったら列挙を停止する例である。最後に見つかったキーボードのインスタンス GUID を KeyboardGUID 変数 (前の例の IDirectInput8::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; 
} // End of callback

最初の引数は、デバイスの情報を格納する DIDEVICEINSTANCE 構造体を指す。この構造体は、DirectInput が自動的に作成する。

2 番目の引数は、IDirectInput8::EnumDevices から渡されたデータを指す。この場合は、変数 KeyboardGUID へのポインタである。この変数にはデフォルト値が割り当てられているが、デバイスが列挙されるたびに、新しい値が割り当てられる。単一のキーボードに対してどのインスタンス GUID を使うかは実際には重要でないが、上のコードは、コールバック関数からインスタンス GUID を取得する方法を具体的に示している。

インスタンス GUID を保存して、後で DirectInputDevice を作成できるようにするのではなく、列挙中に DirectInput が作成したデバイスを保存できる。詳細については、「DirectInput デバイスの作成」を参照すること。

この場合の戻り値は、検索対象のデバイスが見つかれば列挙を停止し、そうでなければ続行することを示す。列挙は、すべてのデバイスの列挙が終了するとすぐに自動的に停止する。

IDirectInput8::EnumDevicesBySemantics によるデバイス列挙の詳細については、「アクション マップ」を参照すること。