SlimDX:Joystick.Poll() 在断开连接的游戏手柄上成功

Adr*_*Cox 1 .net windows directx slimdx

我对 SlimDX 有一个奇怪的问题:我们在 Windows 7 上看到过这个问题,尚未测试其他版本:我使用的是一组廉价 USB 游戏手柄(没有序列号),有时一个物理游戏手柄会结束up 向多个Joystick对象提供输入。

场景是:

  1. 将游戏手柄 1 插入集线器插槽 1。手柄显示DirectInput.GetDevices为 GUID f17b2d30。Joystick为焊盘创建对象。
  2. 将游戏手柄 2 插入集线器插槽 2。手柄显示DirectInput.GetDevices为 GUID 5187d2d0。Joystick为焊盘创建对象。
  3. 按游戏手柄 2 上的按钮。状态不会发生变化。
  4. 按游戏手柄 1 上的按钮。按钮出现在两个对象上的GetCurrentState()后面Poll()
  5. 其对象上的Unplug gamepad 2.Poll()方法继续返回,没有错误,但它不再出现在DirectInput.GetDevices.
  6. 按游戏手柄 1 上的按钮。按钮出现在两个对象上的GetCurrentState()后面Poll()

我已经检查了调试器中的对象。每个都Joystick引用正确的 GUID Information.InstanceGUID,但每个在 中都有相同的 USB 路径Properties.InterfacePath

游戏手柄硬件似乎工作正常 - 如果我使用控制面板操纵杆测试仪执行相同的顺序,游戏手柄仍然不同。

DirectInput GUID 似乎是根据 USB PID 和 VID 分配的,然后是相同游戏手柄的插入顺序,而不是它们插入的 USB 端口的物理路径。如果我混合使用不同型号的游戏手柄,问题就会消失。

感觉像是 SlimDX 甚至 DirectInput 错误 - 有解决方法吗?

Adr*_*Cox 5

我的最终答案是完全放弃 DirectInput,并转向 RawInput。我实现了一个小型 C DLL 来连接我的 C# 代码和 RawInput。

我有两个限制:查找设备名称时遇到问题,以及在 XP 下读取设备信息时发生崩溃。对于我的应用程序来说,这些都不是关键问题。

示例 C++ 源代码有点长,无法容纳答案,因此在这里

从 C# 调用使用以下签名:

    [DllImport("Adapters.dll", CallingConvention = CallingConvention.Cdecl)]
    private static extern int InitialiseGamepads(IntPtr hwnd);
    [DllImport("Adapters.dll", CallingConvention = CallingConvention.Cdecl)]
    private static extern IntPtr GetDevicePath(int index);
    [DllImport("Adapters.dll", CallingConvention = CallingConvention.Cdecl)]
    private static extern int PollDeviceChange();
    [DllImport("Adapters.dll", CallingConvention = CallingConvention.Cdecl)]
    private static extern int ProcessInput(IntPtr wParam, IntPtr lParam,
        out byte buttons, out int x, out int y);
Run Code Online (Sandbox Code Playgroud)