今天搞了一天的DxInput,晚上总结下:
1.创建DirectInput8对象。DirectInput8Create(
HINSTANCE hinst, DWORD dwVersion, REFIID riidltf, LPVOID *ppvOut, LPUNKNOWN punkOuter);
LPDIRECTINPUT8 lpi;
HRESULT hr;
//创建directinput8对象
hr = DirectInput8Create(hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&lpi, NULL);
if (FAILED(hr))
{
return FALSE;
}
2.创建DirectInput设备。
hr = lpi->CreateDevice(GUID_SysKeyboard, &m_keyboard, NULL);
if (FAILED(hr))
{
return FALSE;
}
其中m_keyboard为LPDIRECTINPUTDEVICE8;
3.设置设备的数据格式
hr = m_keyboard->SetDataFormat(&c_dfDIKeyboard);
if (FAILED(hr))
{
return FALSE;
}
这里面的参数是一个结构体,一般采用预定义的全局变量。
4.设置协作等级
hr = m_keyboard->SetCooperativeLevel(hwnd, DISCL_EXCLUSIVE | DISCL_FOREGROUND);
if (hr == DIERR_UNSUPPORTED)
{
MessageBox(hwnd, _T("不支持设置的协作等级"), _T("erro"), 0);
return FALSE;
}
if (FAILED(hr))
{
MessageBox(hwnd, _T("设置协作等级失败"), _T("erro"), 0);
return FALSE;
}
本来我是想把它设为后台独占模式,但是我电脑不支持,所以只好把它设为前台模式了。
5.设置缓冲区
DIPROPDWORD dip;
dip.diph.dwSize = sizeof(DIPROPDWORD);
dip.diph.dwHeaderSize = sizeof(DIPROPHEADER);
dip.diph.dwObj = 0;
dip.diph.dwHow = DIPH_DEVICE;
dip.dwData = 16;
hr = m_keyboard->SetProperty(DIPROP_BUFFERSIZE, &dip.diph);
if (FAILED(hr))
{
return FALSE;
}
6.获取设备访问权
m_keyboard->Acquire();
然后就只需用GetDeviceState对数据进行检索。