Microsoft DirectX 8.0 (C++)

IDirectInputDevice8::GetDeviceData

デバイスからバッファリング データを取得する。

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

パラメータ

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

戻り値

成功した場合は、DI_OK または DI_BUFFEROVERFLOW を返す。

失敗した場合は、次のいずれかのエラー値を返す。

DIERR_INPUTLOST
DIERR_INVALIDPARAM
DIERR_NOTACQUIRED
DIERR_NOTBUFFERED
DIERR_NOTINITIALIZED

注意

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

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

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

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

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

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

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

動作環境

  Windows NT/2000 : Windows 2000 以降に対する再配布可能ファイルとして提供。
  Windows 95/98 : Windows 95 以降に対する再配布可能ファイルとして提供。
  ヘッダー : dinput.h で宣言。

参照

IDirectInputDevice8::Poll、「ポーリングとイベント通知