使用DirectInput与XBOX One控制器和窗口焦点在Windows 10上

时间:2018-02-12 14:04:38

标签: directx slimdx directinput

我正在尝试使用DirectInput来捕获XBOX One控制器输入信号。我将它绑定到C#WinForms应用程序。我遇到的问题是:当表单具有焦点时,它会很好地捕获输入。当窗口失去焦点时,我得不到任何反馈。 在Windows 7上,这不是问题。

我在Windows 10上尝试过其他控制器:PS4,罗技,方向盘等......一切都按预期工作:当窗口失去焦点时,我仍然得到反馈。它只是Windows 10上的XBOX One控制器。

我想也许这与这一行有关:

dev.SetCooperativeLevel(_ctlParent, CooperativeLevel.Background | CooperativeLevel.Nonexclusive);

但是,即使我把这条线拿出来,一切仍然是一样的。

似乎XBOX One控制器忽略CooperativeLevel.Background标志并添加CooperativeLevel.Foreground标志。这是关于旗帜的some more info

有没有其他人熟悉这个问题已经找到了解决方法?

2 个答案:

答案 0 :(得分:1)

Xbox 360公共控制器和Xbox One控制器的驱动程序都模拟“HID”,用于旧游戏的旧版DirectInput API,但仿真往往会有类似这样的怪癖。

可能最好的解决方案是将XINPUT用于这些控制器,并且只回退到传统HID控制器的DirectInput。对于Windows 10 DirectX 12 / UWP应用程序,您也可以直接使用Windows.Gaming.Input

请参阅XINPUT and Windows 8DirectX Tool Kit: Now with GamePads

答案 1 :(得分:0)

我本人就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 Tablets等)
  • Gamepad类仅支持Xbox One认证或Xbox 360兼容游戏手柄(ref),其他游戏手柄可通过RawGameController类(ref)访问。

XInput ref

用于访问4个XInput兼容控制器(例如XBox 360或XBox One控制器)的API

  • XInput控制器可以在后台访问。

限制:

  • 最多4个控制器。
  • 仅支持XInput的设备。
  • 无法激活XBox One控制器触发器中额外的2个隆隆声电机。 (使用Windows.Gaming.Input可以做到这一点。)

DirectInput ref

这些API中最古老的。
无限数量的控制器(?)

限制:

  • XBox不能在后台访问一个控制器。 (错误或功能?)
  • XBox 360和XBox One控制器在同一轴上具有触发器,没有向导按钮,没有隆隆声。
  • Windows Store Apps无法使用DirectInput。 ref
  • Microsoft不再建议使用DirectInput。 ref

原始输入 ref

数量不限的控制器(缺少参考。已通过9个控制器测试。)

  • XBox One和其他控制器可以在后台访问。
    (使用此源代码进行尝试:ref

限制:

  • XBox 360和XBox One控制器在同一轴上具有触发器,没有向导按钮,并且可能没有隆隆声。 (已使用此源代码ref测试)