Microsoft DirectX 8.0 (C++) |
デバイス上でどのボタンまたは軸が使用可能であるかを、アプリケーションが確認しなければならない場合がある。この確認を行うには、デバイスを列挙する場合とほぼ同じ方法でデバイス オブジェクトを列挙する。
注 : デバイス ドライバによる制約のため、キーボードのキーおよびインジケータ ライトの列挙は信頼できない。オブジェクトが存在するかのような偽りの報告が行われる場合がある。使用可能なキーに関する基本的情報は、デバイスのサブタイプから取得できるが、メニュー キーなどの追加オブジェクトが使用可能かどうかを判定するには、ユーザーに入力を求める以外、方法はない。
IDirectInputDevice8::EnumObjects の機能は、IDirectInputDevice8::GetCapabilities と重複するところがある。どちらのメソッドも、使用可能なボタンまたは軸がいくつあるかを確認するのに使用できる。しかし、EnumObjects は、特定のオブジェクトの存在をチェックするよりも、むしろ、使用可能なオブジェクトをすべてカタログ化することを目的としたメソッドである。
EnumObjects メソッドには、IDirectInput8::EnumDevices などのようにコールバック関数があって、各オブジェクトに対してほかの処理をさせることができる。たとえば、オブジェクトをリストに追加したり、ユーザー インターフェイス上に対応する項目を作成したりすることである。
以下のコードは、各オブジェクトの名前を抽出して、文字列リストまたは配列に追加できるようにするコールバックの例である。この標準コールバックは、ドキュメントではプレースホルダ名 DIEnumDeviceObjectsCallback で表されているが、自由に名前を付けることができる。この関数は、列挙されるそれぞれオブジェクトに対して、一度ずつ呼び出されることに注意すること。
char szName[MAX_PATH]; BOOL CALLBACK DIEnumDeviceObjectsCallback( LPCDIDEVICEOBJECTINSTANCE lpddoi, LPVOID pvRef) { lstrcpy(szName, lpddoi->tszName); // szName をリストあるいは配列に追加する。 . . . return DIENUM_CONTINUE; }
1 番目のパラメータは、オブジェクトの情報を格納する構造体へのポインタである。この構造体は、Microsoft® DirectInput® により自動作成される。
2 番目のパラメータは、EnumObjects の 2 番目のパラメータと同等なデータに対するアプリケーション定義ポインタである。この例では、当パラメータは使用されていない。
この場合の戻り値は、列挙するオブジェクトが存在する限り列挙が続くことを示す。
以下は、EnumObjects メソッドを呼び出し、コールバック関数を動作させる例である。
lpdiMouse->EnumObjects(DIEnumDeviceObjectsCallback, NULL, DIDFT_ALL);
1 番目のパラメータは、コールバック関数のアドレスである。2 番目のパラメータは、コールバック関数の中で、使用または変更したいデータへのポインタとして使用できる。この例では、このパラメータを使用していなので、NULL を渡している。3 番目のパラメータは、列挙の中に含めるオブジェクトのタイプ (複数可) を示すフラグである。この例では、すべてのオブジェクトを列挙することになる。列挙の範囲を限定するには、IDirectInputDevice8::EnumObjects にリストされるほかの DIDFT_* フラグを 1 つ以上使用すればよい
注 : DIDFT_* フラグの一部は、ほかのフラグを組み合わせたものである。たとえば、DIDFT_AXIS は、DIDFT_ABSAXIS | DIDFT_RELAXIS と同等である。