我想编写一个与操纵杆交互的程序。我正在使用标准 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 返回一些绝对不正确的随机内容
- Embarcadero RAD Studio XE5/Borland CPP Builder 6(两者的结果相同)
- DirectInput Saitek Rudder Pedals/Saitek X52 控制器(均为崩溃程序)
- 32位应用
- 标准 SDK 示例“操纵杆”
怎么了?错误不匹配与直接输入相关的任何内容。设备创建时没有错误,但任何使用它都会导致错误。
谢谢!
更新:SetCooperativeLevel 函数返回 0x80070006,即 ERROR_INVALID_HANDLE