デバイス オブジェクトの列挙
アプリケーションでは、特定のデバイスで使用可能なボタンや軸の確認が必要になる場合があります。これには、デバイスの列挙とまったく同じ方法でデバイス オブジェクトを列挙します。
注 デバイス ドライバーによる制限があるため、キーボード キーとインジケーター ライトの列挙は信頼性が高くありません。オブジェクトが存在すると誤って報告される場合があります。使用可能なキーに関する基本情報は、デバイス サブタイプから取得できますが、メニュー キーなどの追加オブジェクトが使用可能かどうかについては、ユーザーに入力を求める以外に確認方法はありません。
IDirectInputDevice8::EnumObjects は、ある程度 IDirectInputDevice8::GetCapabilities と重複した機能を持ちます。どちらのメソッドも、使用可能なボタンや軸の数の判別に使用できます。ただし、IDirectInputDevice8::EnumObjects は、特定のオブジェクトのチェックではなく、使用可能なすべてのオブジェクトのカタログ化を目的としています。
IDirectInput8::EnumDevices と同様に、IDirectInputDevice8::EnumObjects メソッドにも、各オブジェクトに対して別の処理を実行できるようにするためのコールバック関数があり、オブジェクトをリストに追加したり、オブジェクトに対応する要素をユーザー インターフェイス上に作成したりできます。
次のサンプル コールバックでは、各オブジェクトの名前を抽出して、文字列リストや配列に追加できるようにしています。この標準コールバックは、プレースホルダー名 DIEnumDeviceObjectsCallback で説明されていますが、任意の名前を付けることができます。この関数は、列挙されたオブジェクトごとに 1 回ずつ呼び出されることに注意してください。
char szName[MAX_PATH];
BOOL CALLBACK DIEnumDeviceObjectsCallback(
LPCDIDEVICEOBJECTINSTANCE lpddoi,
LPVOID pvRef)
{
HRESULT hr = StringCchCopy(szName, MAX_PATH, lpddoi->tszName);
if(SUCCEEDED(hr))
{
// Now add szName to a list or array.
.
.
.
}
else
// Handle errors.
return DIENUM_CONTINUE;
}
最初のパラメーターはオブジェクトに関する情報を格納する構造体へのポインターです。この構造体は DirectInput によって作成されます。
2 番目のパラメーターは、データへのアプリケーション定義のポインターで、IDirectInputDevice8::EnumObjects の 2 番目のパラメーターと同じです。例では、このパラメーターは使用されていません。
この場合の戻り値は、列挙対象のオブジェクトが存在する限り列挙が続行されることを示します。
次の IDirectInputDevice8::EnumObjects メソッドの呼び出しでは、このコールバック関数が動作するようにしています。
lpdiMouse->EnumObjects(DIEnumDeviceObjectsCallback,
NULL, DIDFT_ALL);
最初のパラメーターはコールバック関数のアドレスです。2 番目のパラメーターには、コールバック内で使用または変更する任意のデータへのポインターを指定できます。例では、このパラメーターを使用せず、NULL. を渡しています。3 番目のパラメーターは、列挙に含めるオブジェクトのタイプを示すフラグです。例では、すべてのオブジェクトが列挙されます。列挙を制限するために、IDirectInputDevice8::EnumObjects でリストされているその他の DIDFT_* フラグを 1 つ以上使用することもできます。
注 一部の DIDFT_* フラグは、他のフラグの組み合わせです。たとえば、DIDFT_AXIS は DIDFT_ABSAXIS | DIDFT_RELAXIS と同じです。
アプリケーションがキーボードに排他的アクセス権を持っているときには、DirectInput はすべてのキーボード メッセージを抑制します。ただし、Ctrl + Alt + Del キー、および Microsoft Windows 95 と Windows 98の Alt + Tab キーは例外です。Microsoft Windows 2000 では、排他モードの DirectInput アプリケーションの後で起動されたアプリケーションは、キーボード データを取得できません。