将 DirectInput 与 XBOX One 控制器一起使用 window 专注于 Windows 10
Using DirectInput with XBOX One controller and window focus on Windows 10
我正在尝试使用 DirectInput 来捕获 XBOX One 控制器输入信号。我将它绑定到 C# WinForms 应用程序。我遇到的问题是:当表单具有焦点时,它可以很好地捕获输入。当 window 失去焦点时,我没有得到任何反馈。 在 Windows 7 上,这不是问题。
我在 Windows 10 上尝试过其他控制器:PS4、Logitech、Steering Wheels 等...一切正常:当 window 失去焦点时,我仍然得到反馈。它只是 Windows 10.
上的 XBOX One 控制器
我想这可能与这行有关:
dev.SetCooperativeLevel(_ctlParent, CooperativeLevel.Background | CooperativeLevel.Nonexclusive);
但是,即使我把那条线去掉,一切还是一样。
XBOX One 控制器似乎忽略了 CooperativeLevel.Background
标志并添加了 CooperativeLevel.Foreground
标志。这是关于标志的some more info。
是否有其他熟悉此问题并找到解决方法的人?
Xbox 360 Common Controller 和 Xbox One Controller 的驱动程序都模拟 "HID" 用于旧游戏的旧版 DirectInput API,但模拟往往有一些像这样的怪癖一.
最好的解决方案可能是对这些控制器使用 XINPUT,而对旧版 HID 控制器仅回退到 DirectInput。对于 Windows 10 个 DirectX 12 / UWP 应用程序,您也可以直接使用 Windows.Gaming.Input
。
参见XINPUT and Windows 8 and DirectX Tool Kit: Now with GamePads。
我自己一直在探索关于 XBox One 控制器的问题。当涉及到 XBox One 和 XBox360 控制器时,每个 API 都有自己的一组限制。
以下是我所学的总结:
Windows.Gaming.Input ref
Windows 10.
上的控制器数量不受限制(?)
(直到最近我还认为限制是 8,但我已经用 9 个 XBox 360/XBox One 控制器进行了测试,所以在 DirectXTK 中找到的 MAX_PLAYER_NUMBER=8 并不是根据 Windows 10 的实际限制设置的。 ref)
限制:
- 无法在后台访问控制器...
(虽然不是 100% 确定。我自己还没有让控制器在后台工作,文档说 UWP 应用程序存在此限制。ref)
- 仅适用于 UWP 设备(例如 Windows 10、XBoxOne、Windows 平板电脑等)
- 游戏手柄 class 仅支持 Xbox One 认证或 Xbox 360 兼容游戏手柄 (ref), other gamepads can be accessed via the RawGameController class (ref)。
XInput ref
API 用于访问 4 个 XInput 兼容控制器(例如 XBox 360 或 XBox One 控制器)
- 可以在后台访问 XInput 控制器。
限制:
- 最多 4 个控制器。
- 仅支持 XInput 的设备。
- 无法在 XBox One 控制器触发器中激活额外的 2 个隆隆声马达。 (使用 Windows.Gaming.Input 来做到这一点。)
直接输入 ref
这些 API 中年龄最大的。
无限数量的控制器 (?)
限制:
- 无法在后台访问 XBox One 控制器。 (错误还是功能?)
- XBox 360 和 XBox One 控制器在同一轴上有触发器,没有引导按钮,也没有隆隆声。
- Windows 应用商店不能使用 DirectInput。 ref
- Microsoft 不再推荐使用 DirectInput。 ref
原始输入 ref
无限数量的控制器(缺少参考。测试了 9 个控制器。)
- 可以在后台访问 XBox One 和其他控制器。
(使用此源代码试用一下:ref)
限制:
- XBox 360 和 XBox One 控制器在同一轴上有触发器,没有引导按钮,可能也没有隆隆声。 (使用此源代码测试ref)
我正在尝试使用 DirectInput 来捕获 XBOX One 控制器输入信号。我将它绑定到 C# WinForms 应用程序。我遇到的问题是:当表单具有焦点时,它可以很好地捕获输入。当 window 失去焦点时,我没有得到任何反馈。 在 Windows 7 上,这不是问题。
我在 Windows 10 上尝试过其他控制器:PS4、Logitech、Steering Wheels 等...一切正常:当 window 失去焦点时,我仍然得到反馈。它只是 Windows 10.
上的 XBOX One 控制器我想这可能与这行有关:
dev.SetCooperativeLevel(_ctlParent, CooperativeLevel.Background | CooperativeLevel.Nonexclusive);
但是,即使我把那条线去掉,一切还是一样。
XBOX One 控制器似乎忽略了 CooperativeLevel.Background
标志并添加了 CooperativeLevel.Foreground
标志。这是关于标志的some more info。
是否有其他熟悉此问题并找到解决方法的人?
Xbox 360 Common Controller 和 Xbox One Controller 的驱动程序都模拟 "HID" 用于旧游戏的旧版 DirectInput API,但模拟往往有一些像这样的怪癖一.
最好的解决方案可能是对这些控制器使用 XINPUT,而对旧版 HID 控制器仅回退到 DirectInput。对于 Windows 10 个 DirectX 12 / UWP 应用程序,您也可以直接使用 Windows.Gaming.Input
。
参见XINPUT and Windows 8 and DirectX Tool Kit: Now with GamePads。
我自己一直在探索关于 XBox One 控制器的问题。当涉及到 XBox One 和 XBox360 控制器时,每个 API 都有自己的一组限制。
以下是我所学的总结:
Windows.Gaming.Input ref
Windows 10.
上的控制器数量不受限制(?)
(直到最近我还认为限制是 8,但我已经用 9 个 XBox 360/XBox One 控制器进行了测试,所以在 DirectXTK 中找到的 MAX_PLAYER_NUMBER=8 并不是根据 Windows 10 的实际限制设置的。 ref)
限制:
- 无法在后台访问控制器...
(虽然不是 100% 确定。我自己还没有让控制器在后台工作,文档说 UWP 应用程序存在此限制。ref) - 仅适用于 UWP 设备(例如 Windows 10、XBoxOne、Windows 平板电脑等)
- 游戏手柄 class 仅支持 Xbox One 认证或 Xbox 360 兼容游戏手柄 (ref), other gamepads can be accessed via the RawGameController class (ref)。
XInput ref
API 用于访问 4 个 XInput 兼容控制器(例如 XBox 360 或 XBox One 控制器)
- 可以在后台访问 XInput 控制器。
限制:
- 最多 4 个控制器。
- 仅支持 XInput 的设备。
- 无法在 XBox One 控制器触发器中激活额外的 2 个隆隆声马达。 (使用 Windows.Gaming.Input 来做到这一点。)
直接输入 ref
这些 API 中年龄最大的。
无限数量的控制器 (?)
限制:
- 无法在后台访问 XBox One 控制器。 (错误还是功能?)
- XBox 360 和 XBox One 控制器在同一轴上有触发器,没有引导按钮,也没有隆隆声。
- Windows 应用商店不能使用 DirectInput。 ref
- Microsoft 不再推荐使用 DirectInput。 ref
原始输入 ref
无限数量的控制器(缺少参考。测试了 9 个控制器。)
- 可以在后台访问 XBox One 和其他控制器。
(使用此源代码试用一下:ref)
限制:
- XBox 360 和 XBox One 控制器在同一轴上有触发器,没有引导按钮,可能也没有隆隆声。 (使用此源代码测试ref)