Microsoft DirectX 8.0 (C++)

デバイス能力

デバイスからの入力を要求する前に、ユーザーがその能力をある程度知っておく必要がある。ジョイスティックに視点ハットが付いているか。マウスはユーザーのマシンに現在アタッチされているか。

そうした疑問点は、IDirectInputDevice8::GetCapabilities メソッドを呼び出すことにより解決することができる。このメソッドは、能力に関するデータを DIDEVCAPS 構造体に返す。Microsoft® DirectX® のほかの類似の構造体の場合と同様に、メソッドにこの構造体を渡す前に、dwSize メンバを初期化しておかなければならない。

 :  処理速度やメモリ使用を最適化するために、より小さい DIDEVCAPS_DX3 構造体を利用することができる。構造体の詳細については、Microsoft Software Development Kit (SDK) の Dinput.h を参照すること。

以下のコードは、マウスがアタッチされているかどうか、およびマウスが第 3 軸 (通常は、ホイール) を持っているかどうかをチェックする例である。lpdiMouse は有効な Microsoft DirectInput® デバイスとする。

DIDEVCAPS  DIMouseCaps; 
HRESULT    hr; 
BOOLEAN    WheelAvailable; 
 
DIMouseCaps.dwSize = sizeof(DIDEVCAPS); 
hr = lpdiMouse->GetCapabilities(&DIMouseCaps); 
WheelAvailable = ((DIMouseCaps.dwFlags & DIDC_ATTACHED) 
        && (DIMouseCaps.dwAxes > 2)); 

あるボタンまたは軸が存在するかどうかをチェックするもう 1 つの方法は、そのオブジェクトに対して IDirectInputDevice8::GetObjectInfo を呼び出すことである。その呼び出しに対し DIERR_OBJECTNOTFOUND が返ってきた場合、オブジェクトは存在しない。以下のコードでは、第 3 軸ではないにしても z 軸が存在するかどうかを判断する。

DIDEVICEOBJECTINSTANCE  didoi; 
 
didoi.dwSize = sizeof(DIDEVICEOBJECTINSTANCE); 
hr = lpdiMouse->GetObjectInfo(&didoi, DIMOFS_Z, DIPH_BYOFFSET); 
WheelAvailable = SUCCEEDED(hr);