0

我对 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. 拔下游戏手柄 2.Poll()其对象上的方法继续返回而没有错误,但它不再出现在DirectInput.GetDevices.
  6. 按下游戏手柄 1 上的按钮。按钮出现在两个对象的GetCurrentState()后面。Poll()

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

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

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

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

4

2 回答 2

4

我在这里的最终答案是完全放弃 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);
于 2012-10-20T13:33:02.563 回答
-5

我认为,你应该使用:

Joystick joy;
string UniquePathForEachJoystick = joy.Properties.InterfacePath.ToString();
于 2015-03-10T03:24:25.273 回答