0

我想编写一个与操纵杆交互的程序。我正在使用标准 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

4

1 回答 1

0

最后我发现了问题所在。它在这里撒谎:&c_dfDIJoystick2

出于某种原因,Microsoft 附加了与任何内容都不匹配的预定义结构。甚至 &c_dfDIMouse 也不匹配我简单的 3 键鼠标。答案来自另一个示例代码“自定义格式”。您必须为每个设备创建一个新的格式结构,因为即使是 EnumObjects 函数也不会为您创建,这使得 DirectInput 非常不方便。

于 2014-04-10T15:05:03.937 回答