SlimDX:Joystick.Poll()成功断开游戏手柄
我对SlimDX有一个好奇的问题:我们已经在Windows 7上看到了这一点,并且尚未测试其他版本:我正在使用一捆廉价USB游戏手柄(无序列号),有时一个物理游戏手柄最终将输入提供给多个对象。SlimDX:Joystick.Poll()成功断开游戏手柄
的方案是:
- 插件在手柄1至毂插槽1垫出现在
DirectInput.GetDevices
作为GUID f17b2d30。为pad创建Joystick
对象。 - 将游戏手柄2插入到集线器插槽2中。手柄将作为GUID 5187d2d0出现在
DirectInput.GetDevices
中。为pad创建Joystick
对象。 - 按下游戏手柄2上的按钮。没有改变状态。
- 按下游戏手柄1上的按钮。在两个对象上的
Poll()
之后,按钮出现在GetCurrentState()
中。 - 拔下手柄2.
Poll()
对其方法继续无误地返回,但不再出现在DirectInput.GetDevices
中。 - 按下游戏手柄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 names和a 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);
我想,你应该使用:
Joystick joy;
string UniquePathForEachJoystick = joy.Properties.InterfacePath.ToString();
小心解释为什么这将有助于解决原始问题? – mjuarez
好了,你会与他人共享您的实现? –
@ d.popov编辑添加链接到源代码。 –
谢谢!你能分享Adapters.dll吗? –