Platform SDK: DirectX

IDirectInputDevice7::GetDeviceData

IDirectInputDevice7::GetDeviceData メソッドは、デバイスからバッファリング データを取得する。

HRESULT GetDeviceData(
  DWORD cbObjectData,          
  LPDIDEVICEOBJECTDATA rgdod,  
  LPDWORD pdwInOut,            
  DWORD dwFlags                
);

パラメータ

cbObjectData
DIDEVICEOBJECTDATA 構造体のバイト単位のサイズ。
rgdod
バッファリング データを受け取るための DIDEVICEOBJECTDATA 構造体の配列。この配列の要素数は、pdwInOut パラメータの値と等しくなければならない。このパラメータが NULL の場合、バッファリング データはどこにも格納されないが、その他の副次エフェクトはすべて発生する。
pdwInOut
入力パラメータは、rgdod パラメータが指す配列の要素数である。出力パラメータは、実際に取得された要素数である。
dwFlags
データを取得する方法を制御するフラグ。ゼロまたは次のフラグを指定する。
DIGDD_PEEK
バッファから項目を削除しない。これ以降の IDirectInputDevice7::GetDeviceData 呼び出しで、同じデータを読み取ることができる。通常、データは読み取り後、バッファから削除される。

戻り値

成功すれば DI_OK または DI_BUFFEROVERFLOW

失敗すれば次のエラー値のいずれかを返す。

DIERR_INPUTLOST
DIERR_INVALIDPARAM
DIERR_NOTACQUIRED
DIERR_NOTBUFFERED
DIERR_NOTINITIALIZED

注意

デバイス データを取得する前に、IDirectInputDevice7::SetDataFormat メソッドでデータ形式を設定し、IDirectInputDevice7::SetProperty メソッドでバッファ サイズを設定し、続いて IDirectInputDevice7::Acquire メソッドでデバイスを取得しなければならない。

以下の例では、バッファリング データ要素を最高 10 個まで読み取る。デバイス バッファからは、データを読み取りながら削除している。

DIDEVICEOBJECTDATA rgdod[10];
DWORD dwItems = 10;
hres = IDirectInputDevice7_GetDeviceData(
pdid,
sizeof(DIDEVICEOBJECTDATA),
rgdod,
&dwItems,
    0); 
if (SUCCEEDED(hres)) {
// dwItems = 読み取られた要素数 (0 になる)。
if (hres == DI_BUFFEROVERFLOW) {
// バッファがオーバーフローした。
    } 
} 

バッファをフラッシュして、フラッシュした項目の数を取得するには、rgdod パラメータに NULL、pdwInOut パラメータに INFINITE を含む変数へのポインタをそれぞれ指定する。以下の例で、その方法を示す。

dwItems = INFINITE;
hres = IDirectInputDevice7_GetDeviceData(
pdid,
sizeof(DIDEVICEOBJECTDATA),
NULL,
&dwItems,
            0); 
if (SUCCEEDED(hres)) {
// バッファのフラッシュに成功。
// dwItems = フラッシュした要素数。
if (hres == DI_BUFFEROVERFLOW) {
// バッファがオーバーフローした。
    } 
} 

デバイス バッファ中の要素数を調べるには、rgdod パラメータに NULL、pdwInOut パラメータに INFINITE、dwFlags に DIGDD_PEEK をそれぞれ指定する。以下の例で、その方法を示す。

dwItems = INFINITE;
hres = IDirectInputDevice7_GetDeviceData(
pdid,
sizeof(DIDEVICEOBJECTDATA),
NULL,
&dwItems,
DIGDD_PEEK);
if (SUCCEEDED(hres)) {
// dwItems = バッファ内の要素数。
if (hres == DI_BUFFEROVERFLOW) {
// バッファ オーバーフローが発生。一部のデータ
// のキャプチャに失敗した。
    } 
} 

バッファ オーバーフローが発生したかどうかを調べるには、rgdod パラメータに NULL、pdwInOut パラメータにゼロを設定する。以下の例で、その方法を示す。

dwItems = 0;
hres = IDirectInputDevice7_GetDeviceData(
pdid,
sizeof(DIDEVICEOBJECTDATA),
NULL,
&dwItems,
            0); 
if (hres == DI_BUFFEROVERFLOW) {
// バッファ オーバーフローが発生。
} 

動作環境

  Windows NT/2000 :Windows 2000 が必要。
  Windows 95/98 : Windows 95 以降が必要。Windows 95 用に再配布可能な形で使用可能。
  ヘッダー : dinput.h で宣言。
  インポート ライブラリ : dinput.lib を使用。

参照

IDirectInputDevice7::Poll、「ポーリングとイベント