Adr*_*Cox 1 .net windows directx slimdx
我对 SlimDX 有一个奇怪的问题:我们在 Windows 7 上看到过这个问题,尚未测试其他版本:我使用的是一组廉价 USB 游戏手柄(没有序列号),有时一个物理游戏手柄会结束up 向多个Joystick对象提供输入。
场景是:
DirectInput.GetDevices为 GUID f17b2d30。Joystick为焊盘创建对象。DirectInput.GetDevices为 GUID 5187d2d0。Joystick为焊盘创建对象。GetCurrentState()后面Poll()。Poll()方法继续返回,没有错误,但它不再出现在DirectInput.GetDevices.GetCurrentState()后面Poll()。我已经检查了调试器中的对象。每个都Joystick引用正确的 GUID Information.InstanceGUID,但每个在 中都有相同的 USB 路径Properties.InterfacePath。
游戏手柄硬件似乎工作正常 - 如果我使用控制面板操纵杆测试仪执行相同的顺序,游戏手柄仍然不同。
DirectInput GUID 似乎是根据 USB PID 和 VID 分配的,然后是相同游戏手柄的插入顺序,而不是它们插入的 USB 端口的物理路径。如果我混合使用不同型号的游戏手柄,问题就会消失。
感觉像是 SlimDX 甚至 DirectInput 错误 - 有解决方法吗?
我的最终答案是完全放弃 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)