IDirectInputDevice8::GetDeviceData
デバイスからバッファー データを取得します。
HRESULT
GetDeviceData(
DWORD cbObjectData,
LPDIDEVICEOBJECTDATA rgdod,
LPDWORD pdwInOut,
DWORD dwFlags
);
パラメータ
- cbObjectData
DIDEVICEOBJECTDATA 構造体のサイズ (バイト単位)。 - rgdod
バッファー データを受け取る DIDEVICEOBJECTDATA 構造体の配列。この配列の要素数は、pdwInOut パラメーターの値と等しいことが必要です。このパラメーターが NULL ならば、バッファー データはどこにも保管されませんが、その他の副次的な影響はすべて発生します。 - pdwInOut
開始時には、rgdod パラメーターによって指示される配列の要素数。終了時には、実際に取得した要素数。 - dwFlags
データの取得方法を制御するフラグ。この値には 0、または次のフラグを設定します。- DIGDD_PEEK
バッファーから項目を削除しません。以降の IDirectInputDevice8::GetDeviceData 呼び出しでは、同じデータが読み取られます。通常、データは読み取られた後にバッファーから削除されます。
- DIGDD_PEEK
戻り値
メソッドが正常に実行された場合、戻り値は DI_OK または DI_BUFFEROVERFLOW です。メソッドが失敗した場合、戻り値は次のいずれかのエラー値です。DIERR_INPUTLOST、DIERR_INVALIDPARAM、DIERR_NOTACQUIRED、DIERR_NOTBUFFERED、DIERR_NOTINITIALIZED
解説
注 メソッドが DI_BUFFEROVERFLOW を返した場合、rgdod 配列のデータは切り捨てられています。
DirectInput のデバッグ バージョンでは、IDirectInputDevice8::GetDeviceData の呼び出しが行われた場合にデバイスが獲得されていないと、デバイス データ バッファーにランダムなバイトが送られます。ランダムなデバイス データを使用しないようにするには、常に DIERR_UNACQUIRED 戻りコードをチェックしてください。
デバイス データを取得するには、その前に IDirectInputDevice8::SetDataFormat メソッドと IDirectInputDevice8::SetProperty メソッドを使用するか、IDirectInputDevice8::SetActionMap メソッドを使用して、データ フォーマットとバッファー サイズを設定する必要があります。また、IDirectInputDevice8 インターフェイス メソッドを使用してデバイスを獲得する必要があります。
バッファーが保持するイベントの最大数は、IDirectInputDevice8::SetProperty メソッドによって設定されたバッファー サイズより 1 つ小さい数です。
次のコード例では、バッファー データ要素を 10 個まで読み取り、読み取りと同時にデバイス バッファーからデータを削除します。
DIDEVICEOBJECTDATA rgdod[10];
DWORD dwItems = 10;
hres = idirectinputdevice9_GetDeviceData(
sizeof(DIDEVICEOBJECTDATA),
rgdod,
&dwItems,
0);
if (SUCCEEDED(hres)) {
// dwItems = Number of elements read (could be zero).
if (hres == DI_BUFFEROVERFLOW) {
// Buffer had overflowed.
}
}
アプリケーションは、バッファーをフラッシュして、フラッシュされた項目の数を取得できます。このためには、rgdod パラメーターに NULL を指定し、pdwInOut パラメーターに INFINITE を含む変数へのポインターを指定します。次のコード例で、この操作を行う方法を示します。
dwItems = INFINITE;
hres = idirectinputdevice9_GetDeviceData(
pdid,
sizeof(DIDEVICEOBJECTDATA),
NULL,
&dwItems,
0);
if (SUCCEEDED(hres)) {
// Buffer successfully flushed.
// dwItems = Number of elements flushed.
if (hres == DI_BUFFEROVERFLOW) {
// Buffer had overflowed.
}
}
rgdod パラメーターを NULL に設定し、pdwInOut を INFINITE に設定し、dwFlags を DIGDD_PEEK に設定することによって、アプリケーションでデバイス バッファーの要素数を問い合わせることができます。次のコード例で、この操作を行う方法を示します。
dwItems = INFINITE;
hres = idirectinputdevice9_GetDeviceData(
pdid,
sizeof(DIDEVICEOBJECTDATA),
NULL,
&dwItems,
DIGDD_PEEK);
if (SUCCEEDED(hres)) {
// dwItems = Number of elements in buffer.
if (hres == DI_BUFFEROVERFLOW) {
// Buffer overflow occurred; not all data
// was successfully captured.
}
}
バッファー オーバーフローが発生したかどうか問い合わせるには、rgdod パラメーターを NULL に設定し、pdwInOut パラメーターを 0 に設定します。次のコード例で、この操作を行う方法を示します。
dwItems = 0;
hres = idirectinputdevice9_GetDeviceData(
pdid,
sizeof(DIDEVICEOBJECTDATA),
NULL,
&dwItems,
0);
if (hres == DI_BUFFEROVERFLOW) {
// Buffer overflow occurred.
}
要件
ヘッダー: Dinput.h 宣言