我想写一个与操纵杆交互的程序。我正在使用标准SDK示例和dinput8.lib。
这是密码。GUID取自enumJoysticksCallback函数。我把所有的东西都扔掉,尽量减少出错的机会。
LPDIRECTINPUT8 g_pDI = NULL;
LPDIRECTINPUTDEVICE8 g_pJoystick = NULL;
HRESULT hr = DirectInput8Create ( GetModuleHandle( NULL ), DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&g_pDI, NULL );
GUID *GUID_Saitek = new _GUID ;
GUID_Saitek->Data1 = 0xA00DBD70;
GUID_Saitek->Data2 = 0x7FB5;
GUID_Saitek->Data3 = 0x11E3;
char tmp[8] = { 0x80, 0x3, 0x44, 0x45, 0x53, 0x54, 0x0, 0x0 };
memcpy(GUID_Saitek->Data4, tmp, 8);
g_pDI->CreateDevice( *GUID_Saitek, &g_pJoystick, NULL );
hr = g_pJoystick->SetDataFormat( &c_dfDIJoystick2 ) ;程序在此字符串上失败。
hr = g_pJoystick->SetDataFormat( &c_dfDIJoystick2 );hr返回0x80070216,这似乎是ERROR_ARITHMETIC_OVERFLOW。
&c_dfDIJoystick而不是&c_dfDIJoystick2也无济于事。
对老鼠来说是一样的。
LPDIRECTINPUT8 di = NULL;
LPDIRECTINPUTDEVICE8 Mouse = NULL;
HRESULT hr = DirectInput8Create(GetModuleHandle( NULL ), DIRECTINPUT_VERSION, IID_IDirectInput8, (VOID**)&di, NULL);
hr = di->CreateDevice( GUID_SysMouse, &Mouse, NULL );
hr = Mouse->SetDataFormat( &c_dfDIMouse ) ;hr再次返回0x80070216,示例应用程序"Joystick.exe“工作正常。
GetCapabilities返回一些肯定不正确的随机内容
怎么啦?错误不匹配任何与directinput相关的内容。设备的创建没有错误,但是任何与它的工作都会导致错误。
谢谢!
更新: SetCooperativeLevel函数返回0x80070006,即ERROR_INVALID_HANDLE
发布于 2014-04-10 15:05:03
最后我发现了问题所在。它在这里撒谎:&c_dfDIJoystick2
由于某些原因,微软附加了预定义的结构,不匹配任何一个。即使是&c_dfDIMouse也不匹配我的简单3按钮鼠标。答案是另一个示例代码“自定义格式”。您必须为每个设备创建一个新的格式结构,因为即使是EnumObjects函数也不能为您提供新的格式结构,这使得DirectInput非常不方便。
https://stackoverflow.com/questions/22953393
复制相似问题