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

Posted

技术标签:

【中文标题】在 Windows 10 上使用 DirectInput 和 XBOX One 控制器和窗口焦点【英文标题】:Using DirectInput with XBOX One controller and window focus on Windows 10 【发布时间】:2018-02-12 14:04:37 【问题描述】:

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

我在 Windows 10 上尝试过其他控制器:PS4、Logitech、Steering Wheels 等...一切正常:当窗口失去焦点时,我仍然会收到反馈。它只是 Windows 10 上的 XBOX One 控制器。

我想也许这与这条线有关:

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

但是,即使我把那条线去掉,一切仍然是一样的。

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

是否有其他熟悉此问题并找到解决方法的人?

【问题讨论】:

您知道 SharpDX 使用的是旧版 DirectInput、XINPUT 还是 Windows.Gaming.Input? 我很确定它是 DirectInput 的包装器。我调用的 API 在调用时几乎匹配 1-for-1(我从使用 DirectInput 的 C++ 程序移植了它) 好的,首先要说的是,您应该在 Xbox 360 / Xbox One 游戏控制器上使用 XINPUT 或 Windows.Gaming.Input,而对于旧式 HID 控制器只能使用 DirectInput。对这些控制器的 DirectInput 支持主要用于旧游戏,因此在使用该模拟时它们会有一些怪癖。 @ChuckWalbourn,谢谢——我会去看看,看看这是否适用于我们的解决方案。感谢您抽出宝贵时间提供帮助。 嘿@ChuckWalbourn,它对我有用!如果您对 XINPUT 做出回答,我会接受。命名空间 Windows.Gaming.Input 用于 UWP 应用程序,但我找到了一个 .NET 包装器 (github.com/speps/XInputDotNet)。再次感谢您的帮助。 【参考方案1】:

我自己一直在探索有关 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 平板电脑等) 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 来做到这一点。)

直接输入 ref

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

限制:

无法在后台访问 Xbox One 控制器。 (错误还是功能?) Xbox 360 和 Xbox One 控制器在同一轴上具有触发器,没有引导按钮,也没有隆隆声。 Windows 应用商店应用程序无法使用 DirectInput。 ref Microsoft 不再建议使用 DirectInput。 ref

原始输入 ref

无限数量的控制器(缺乏参考。用 9 个控制器测试。)

Xbox One 和其他控制器可以在后台访问。 (使用此源代码试用:ref)

限制:

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

【讨论】:

如果有人曾经设法在非 UWP/Windows 应用商店应用中使用 Windows.Gaming.Input 在后台访问控制器,请在 cmets 中告诉我。 使用在运行时加载的 WinRT API(使用 LoadLibrary and GetProcAddress)和 Windows.Gaming.Input 类用法编写的原生 Windows 应用程序。当窗口没有聚焦并且没有问题时,振动似乎可以正常工作。 @DJm00n 您是否有可以参考的开源存储库中的工作示例代码?我有一个用例,在后台访问会非常有用。 据我所知,Windows.gaming.input 设计为仅在有窗口且有焦点时运行。请参阅***.com/questions/57042069/… 了解详细信息以及我的测试存储库的链接。 感谢 DJm00N!我也认为无法通过 Windows.Gaming.Input 在后台访问控制器,但您之前发布的游戏让我有些希望。感谢您消除困惑。【参考方案2】:

Xbox 360 通用控制器和 Xbox One 控制器的驱动程序都模拟“HID”,以便与旧游戏的旧版 DirectInput API 一起使用,但这种模拟往往有一些类似这样的怪癖。

可能最好的解决方案是对这些控制器使用 XINPUT,而对于旧式 HID 控制器仅回退到 DirectInput。对于 Windows 10 DirectX 12 / UWP 应用,您也可以直接使用Windows.Gaming.Input

参见XINPUT and Windows 8 和DirectX Tool Kit: Now with GamePads。

【讨论】:

有点跑题了,但我会继续努力的。一次只有一个窗口可以接收来自游戏手柄的 xinput/直接输入输入消息,对吗?

以上是关于在 Windows 10 上使用 DirectInput 和 XBOX One 控制器和窗口焦点的主要内容,如果未能解决你的问题,请参考以下文章

使用 CMake 在 Windows 10 上构建 uWebSockets

在iis上使用Htaccess文件(Windows 10)

在windows 10上使用qemu安装Windows 10虚拟机

在windows 10上使用qemu安装Windows 10虚拟机

无法在 Windows 10 上使用 pip install

使用 freeglut 在 Windows 10 上出现 glDebugMessageCallback 问题