将 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