SlimDX:Joystick.Poll()成功断开游戏手柄

问题描述:

我对SlimDX有一个好奇的问题:我们已经在Windows 7上看到了这一点,并且尚未测试其他版本:我正在使用一捆廉价USB游戏手柄(无序列号),有时一个物理游戏手柄最终将输入提供给多个对象。SlimDX:Joystick.Poll()成功断开游戏手柄

的方案是:

  1. 插件在手柄1至毂插槽1垫出现在DirectInput.GetDevices作为GUID f17b2d30。为pad创建Joystick对象。
  2. 将游戏手柄2插入到集线器插槽2中。手柄将作为GUID 5187d2d0出现在DirectInput.GetDevices中。为pad创建Joystick对象。
  3. 按下游戏手柄2上的按钮。没有改变状态。
  4. 按下游戏手柄1上的按钮。在两个对象上的Poll()之后,按钮出现在GetCurrentState()中。
  5. 拔下手柄2. Poll()对其方法继续无误地返回,但不再出现在DirectInput.GetDevices中。
  6. 按下游戏手柄1上的按钮。在两个对象上的Poll()之后,按钮出现在GetCurrentState()中。

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

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

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

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

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

我有两个限制:trouble finding device namesa crash reading device information under XP。这些都不是我的应用程序的关键问题。

示例C++源代码有点长,以适应答案so is here

从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); 
+0

好了,你会与他人共享您的实现? –

+0

@ d.popov编辑添加链接到源代码。 –

+0

谢谢!你能分享Adapters.dll吗? –

我想,你应该使用:

Joystick joy; 
string UniquePathForEachJoystick = joy.Properties.InterfacePath.ToString(); 
+1

小心解释为什么这将有助于解决原始问题? – mjuarez