我想编写一个与游戏杆交互的程序。我正在使用标准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相关的任何内容都不匹配。设备创建时没有错误,但任何使用它的工作都会导致错误。
谢谢!
UPDATE:SetCooperativeLevel函数返回0x80070006,即ERROR_INVALID_HANDLE
答案 0 :(得分:0)
最后我发现了问题所在。它在这里撒谎:& c_dfDIJoystick2
由于某些原因,Microsoft附加了与anythig不匹配的预定义结构。甚至& c_dfDIMouse与我的简单3键鼠标不匹配。 答案来自另一个示例代码“自定义格式”。 你必须为每个设备创建一个新的格式结构,因为即使是EnumObjects函数也不会为你创建,这使得DirectInput非常不方便。