Platform SDK: DirectX

デバイス能力

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

[C++]

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

 :  処理速度やメモリ使用を最適化するために、より小さい DIDEVCAPS_DX3 構造体を利用することができる。

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

//  LPDIRECTINPUTDEVICE7  lpdiMouse;  // 以前に初期化済み
 
DIDEVCAPS DIMouseCaps;
HRESULT hr;
BOOLEAN    WheelAvailable; 
 
DIMouseCaps.dwSize = sizeof(DIDEVCAPS);
hr = lpdiMouse->GetCapabilities(&DIMouseCaps);
WheelAvailable = ((DIMouseCaps.dwFlags & DIDC_ATTACHED)
&& (DIMouseCaps.dwAxes > 2));

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

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

そうした疑問点は、DirectInputDevice.GetCapabilities メソッドを呼び出すことにより解決することができる。このメソッドは、能力に関するデータを DIDEVCAPS 型に返す 。

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

' diMouse は、有効な DirectInputDevice オブジェクトである。*/
 
Dim WheelAvailable As Boolean
Dim dicaps as DIDEVCAPS
 
Call diDev.GetCapabilities(dicaps)
WheelAvailable = ((dicaps.lFlags And DIDC_ATTACHED) _
And (dicaps.lAxes > 2))

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

Dim didoi As DirectInputDeviceObjectInstance
On Error GoTo NOTFOUND
Set didoi = diDev.GetObjectInfo(DIMOFS_Z, DIPH_BYOFFSET)
On Error GoTo 0
.
.
.
NOTFOUND:
If Err.Number = DIERR_NOTFOUND Then
MsgBox "No z-axis found."
End If