Xbox 360 无线控制器无法通过 C++/WinRT 和控制台应用程序中的 Windows.Gaming.Input API 工作

Xbox 360 Wireless Controller is not working via C++/WinRT and Windows.Gaming.Input API in console application

我尝试使用 Windows 控制台应用程序中的 Windows.Gaming.Input API via C++/WinRT,但它无法正常工作 Xbox 360 Wireless Controller(报告为 Xbox 360 Wireless Receiver for Windows (0x045e:0x0000)).

我收到 GamepadAdded 事件,然后尝试通过 gamepad.GetCurrentReading() 读取游戏手柄状态,似乎 GamepadReading 结构根本没有填充 Xbox 360 Wireless Controller .

我还发现 MSVS 调试控制台上有一些奇怪的错误消息:

onecoreuap\xbox\devices\api\winrt\pnpdevicewatcher.cpp(500)\Windows.Gaming.Input.dll!00007FFE453AABC7: (caller: 00007FFE453AA367) ReturnHr(1) tid(4e04) 80070006 The handle is invalid.

Xbox One Game Controller (0x045e:0x02d1) 不过工作正常。

我的代码有什么问题?或者这是 Windows 中的错误?

代码在这里:https://github.com/DJm00n/cppwinrtgamepad

使用 Windows 10 1809,MSVS 2017 15.9.9,cppwinrt v1.0.190211.5,Windows SDK v10.0.17763.0,xusb22.sys v10.0.17163.1, xboxgip.sys v10.0.17163.1.

PS:我还尝试了 https://github.com/microsoft/Windows-universal-samples 存储库中的 UWP Simple3DGameXaml 应用程序 - 两个控制器都在其中工作。

为了帮助我们更清楚地调查此问题,能否将您的 Visual Studio 2017 版本分享给我们?您可以获得版本信息,选择帮助 -> 关于 Microsoft Visual Studio,然后从关于对话框的右侧选择复制信息。

能否请您检查是否可以使用 SDK 18362 在 1903 上重现此问题?

对了,如果你的项目依赖也能升级就更好了,你用的是旧版本的Microsoft.Windows.CppWinRTNuGet包:1.0.190211.5。当前最新的稳定版本是 v2.0.190722.3。

另外,在项目属性中设置了C++语言标准,但是没有设置值。这应该在项目属性下设置为 ISO C++17 标准 (/std:c++17) -> C/C++ > 语言 > C++ 语言标准。

感谢您的配合。

这是一个已知问题。显然这是由焦点处理的工作方式引起的。因此,Windows.Gaming.Input 基本上不适用于控制台应用程序,但适用于具有 window 焦点的 Win32 或 UWP 应用程序。

Note that the one case where the Xbox One controller worked for you is only because both the user was an admin -and- because you had developer mode enabled. It wouldn't work from a console app at all otherwise.

如果您需要对旧版 Win32 控制台应用程序的游戏控制器支持,您应该使用 XINPUT。参见 this blog post