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