次の方法で共有


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 呼び出しでは、同じデータが読み取られます。通常、データは読み取られた後にバッファーから削除されます。

戻り値

メソッドが正常に実行された場合、戻り値は 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 宣言

関連項目

IDirectInputDevice8::ポーリング, ポーリングとイベント通知