Platform SDK: DirectX

デバイス オブジェクトの列挙

デバイス上でどのボタンまたは軸が使用可能であるかを、アプリケーションが確認しなければならない場合がある。この確認を行うには、デバイスを列挙する場合とほぼ同じ方法でデバイス オブジェクトを列挙する。

[C++]

IDirectInputDevice7::EnumObjects の機能は、IDirectInputDevice7::GetCapabilities と重複するところがある。どちらのメソッドも、使用可能なボタンまたは軸がいくつあるかを確認するのに使用できる。しかし、EnumObjects は、特定のオブジェクトの存在をチェックするよりも、むしろ、使用可能なオブジェクトをすべてカタログ化することを目的としたメソッドである。たとえば、DirectX SDK のサンプル コード中の DirectInput QuickTest アプリケーションは、EnumObjects を使用して、選択したデバイスの [Object] ページ上にリストを登録する。

EnumObjects メソッドには、IDirectInput7::EnumDevices などのようにコールバック関数があって、各オブジェクトに対してほかの処理をさせることができる。たとえば、オブジェクトをリストに追加したり、ユーザー インターフェイス上に対応する項目を作成したりすることである。

以下のコードは、各オブジェクトの名前を抽出して、文字列リストまたは配列に追加できるようにする例である。この標準コールバックは、ドキュメントではプレースホルダ名 DIEnumDeviceObjectsCallback で表されているが、自由に名前を付けることができる。この関数は、列挙されるそれぞれオブジェクトに対して、一度ずつ呼び出されることに注意すること。

char szName[MAX_PATH];
 
BOOL CALLBACK DIEnumDeviceObjectsCallback( 
                      LPCDIDEVICEOBJECTINSTANCE lpddoi,
                      LPVOID pvRef) 
{ 
  lstrcpy(szName, lpddoi->tszName); 
// szName をリストあるいは配列に追加する。
  . 
  . 
  . 
return DIENUM_CONTINUE;
} 

1 番目のパラメータは、オブジェクトの情報を格納する構造体へのポインタである。この構造体は、DirectInput により自動作成される。

2 番目のパラメータは、EnumObjects の 2 番目のパラメータと同等なデータに対するアプリケーション定義ポインタである。この例では、当パラメータは使用されていない。

この場合の戻り値は、列挙するオブジェクトが存在する限り列挙が続くことを示す。

以下のコードは、EnumObjects メソッドを呼び出し、コールバック関数を動作させる例である。

lpdiMouse->EnumObjects(DIEnumDeviceObjectsCallback, 
                       NULL, DIDFT_ALL); 

1 番目のパラメータは、コールバック関数のアドレスである。

2 番目のパラメータは、コールバック関数の中で、使用または変更したいデータへのポインタとして使用できる。この例では、このパラメータを使用していなので、NULL を渡している。

3 番目のパラメータは、列挙の中に含めるオブジェクトのタイプ (複数可) を示すフラグである。この例では、すべてのオブジェクトを列挙することになる。列挙の範囲を限定するには、IDirectInput7::EnumDevices にリストされるほかの DIDFT_* フラグを 1 つ以上使用すればよい

 :  DIDFT_* フラグの一部は、ほかのフラグを組み合わせたものである。たとえば、DIDFT_AXIS は、DIDFT_ABSAXIS | DIDFT_RELAXIS と同等である。

[Visual Basic]

DirectInputDevice.GetDeviceObjectsEnum を呼び出すことで、デバイス オブジェクトを列挙する。これにより、要求したパラメータに一致する使用可能なデバイス オブジェクトのコレクションを表す DirectInputEnumDeviceObjects クラスのインスタンスが返される。

以下のコードは、デバイス上の軸を列挙する例である。

' diDev は DirectInputDevice オブジェクトである。
 
Dim diEnumObjects As DirectInputEnumDeviceObjects
Set diEnumObjects = diDev.GetDeviceObjectsEnum(DIDFT_AXIS)

パラメータは、列挙の中に含めるオブジェクトのタイプ (複数可) を示すフラグである。

 :  CONST_DIDFTFLAGS フラグの一部は、ほかのフラグを組み合わせたものである。たとえば、DIDFT_AXIS は、DIDFT_ABSAXIS OR DIDFT_RELAXIS と同等である。

特定のデバイス オブジェクトに関する情報を取得するには、DirectInputDeviceObjectInstance オブジェクトの各メソッドを呼び出す。このオブジェクトは、DirectInputEnumDeviceObjects.GetItem を呼び出すことで取得される。利用可能なデバイスの情報には、デバイスの名前、タイプ、およびデータ構造体内でのオフセットなどがある。

以下のコードは、前例で列挙された軸の名前をリストする例である。

Dim diDevEnumObjects As DirectInputEnumDeviceObjects
Set diDevEnumObjects = diDev.GetDeviceObjectsEnum(DIDFT_AXIS)

Dim diDevObjInstance As DirectInputDeviceObjectInstance
Dim i As Integer
For i = 1 To diEnumObjects.GetCount
Set diDevObjInstance = diEnumObjects.GetItem(i)
Call List1.AddItem(diDevObjInstance.GetName)
Next i