我有一台运行 Windows 8.1 的游戏电脑。它一直存在一个问题,即任何连接的控制器的顺序都会任意变化。我已经配置了许多游戏和模拟器,以期望控制器按特定顺序排列,但当我打开“游戏控制器”控制面板(即 joy.cpl)或运行 dxdiag 时,我可以看到控制器的顺序已经改变,弄乱了我所有的绑定。
这只会影响使用 DirectInput 读取控制器输入的游戏。使用 Xinput 的游戏可以正常运行。
我很清楚这些游戏使用 DirectInput 枚举控制器的顺序来确定它们在游戏中的顺序。这与它们在“游戏控制器”控制面板中出现的顺序相同。
有什么办法可以改变这个顺序吗?
到目前为止,我发现的唯一问题是,如果我物理断开作为控制器或为控制器提供接口的 USB 设备(如 Xbox 360 无线接收器或 USB 蓝牙适配器),然后重新插入,这些控制器将移至列表末尾。但这就是我所得到的全部。我不知道如何使这个过程自动化。我尝试使用 devcon 命令自动删除这些设备并重新扫描,虽然有时它可以工作,但它经常报告需要重新启动计算机才能删除设备,这意味着它对 DirectInput 枚举顺序没有影响。
答案1
多年来,由于 Windows 8.1 对控制器的任意排序,我的控制器绑定变得混乱,并且没有办法重新排序,所以我自己动手编写了这个工具:重新排序
答案2
有些游戏会根据注册表中的 JoyID 确定控制器的顺序。要更改 JoyID,请使用名为 JoyIDs 的程序: https://theairtacticalassaultgroup.com/forum/showthread.php?t=13009
然后还有一些游戏根据控制器在游戏控制器(joy.cpl)中的列出方式来确定控制器的顺序:
一款具有此功能的游戏是《战地 2》。无论您的操纵杆具有哪些 ID,在游戏控制器中选择了哪些默认控制器,它都只能识别游戏控制器列表中的前 2 个操纵杆,即使它们的 ID 分别为 20 和 21,并且还有 20 个其他操纵杆连接在 ID 0-19 处。
就我而言,它只能识别 Logitech Extreme 3D 和 vJoy Device,但不能识别 Arduino Leonardo,即使我将 Arduino Leonardo 设置为默认设备并将其设置为 ID1:
但是如果我随意更改游戏控制器中的顺序,它总是会识别前 2 个控制器。问题是,如何更改游戏控制器中的控制器顺序不太明显。
我通过在设备管理器中卸载设备,然后拔下设备并重新插入来对游戏控制器中的控制器列表进行排序。对于 vJoy,您可以从设备管理器中卸载设备,然后在与 vJoy 一起安装的配置 vJoy 工具中重新启用它们。视频演示: https://youtu.be/tZTfdY6cW1Q