The IDirectInputDevice::GetDeviceData method retrieves buffered data from the device.
HRESULT GetDeviceData(
DWORD cbObjectData,
LPDIDEVICEOBJECTDATA rgdod,
LPDWORD pdwInOut,
DWORD dwFlags
);
DIGDD_PEEK | |
Do not remove the items from the buffer. A subsequent IDirectInputDevice::GetDeviceData call will read the same data. Normally, data is removed from the buffer after it is read. |
If the method succeeds, the return value is DI_OK or DI_BUFFEROVERFLOW.
If the method fails, the return value may be one of the following error values:
DIERR_INPUTLOST |
DIERR_INVALIDPARAM |
DIERR_NOTACQUIRED |
DIERR_NOTBUFFERED |
DIERR_NOTINITIALIZED |
Before device data can be obtained, you must set the data format by using the IDirectInputDevice::SetDataFormat method, set the buffer size with IDirectInputDevice::SetProperty method, and acquire the device by using the IDirectInputDevice::Acquire method.
The following example reads up to ten buffered data elements, removing them from the device buffer as they are read.
DIDEVICEOBJECTDATA rgdod[10];
DWORD dwItems = 10;
hres = IDirectInputDevice_GetDeviceData(
pdid,
sizeof(DIDEVICEOBJECTDATA),
rgdod,
&dwItems,
0);
if (SUCCEEDED(hres)) {
// dwItems = number of elements read (could be zero)
if (hres == DI_BUFFEROVERFLOW) {
// Buffer had overflowed.
}
}
Your application can flush the buffer and retrieve the number of flushed items by specifying NULL for the rgdod parameter and a pointer to a variable containing INFINITE for the pdwInOut parameter. The following example illustrates how this can be done:
dwItems = INFINITE;
hres = IDirectInputDevice_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.
}
}
Your application can query for the number of elements in the device buffer by setting the rgdod parameter to NULL, setting pdwInOut to INFINITE and setting dwFlags to DIGDD_PEEK. The following code fragment illustrates how this can be done:
dwItems = INFINITE;
hres = IDirectInputDevice_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
// were successfully captured.
}
}
To query about whether a buffer overflow has occurred, set the rgdod parameter to NULL and the pdwInOut parameter to zero. The following example illustrates how this can be done:
dwItems = 0;
hres = IDirectInputDevice_GetDeviceData(
pdid,
sizeof(DIDEVICEOBJECTDATA),
NULL,
&dwItems,
0);
if (hres == DI_BUFFEROVERFLOW) {
// Buffer overflow occurred
}
Windows NT: Use version 5.0 or later.
Windows: Use Windows 95 or later. Available as a redistributable for Windows 95.
Windows CE: Unsupported.
Header: Declared in dinput.h.
Import Library: Use dinput.lib.