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。
我尝试使用 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。