I trying to use Windows.Gaming.Input
API via C++/WinRT from Windows Console Application and it is not working as supposed with Xbox 360 Wireless Controller
(reported as Xbox 360 Wireless Receiver for Windows (0x045e:0x0000)
).
I got GamepadAdded
event, then trying to read gamepad state via gamepad.GetCurrentReading()
and seems GamepadReading
struct is not filled at all for Xbox 360 Wireless Controller
.
Also I found that there is some strange error message on MSVS debug console:
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)
is working fine though.
What is wrong with my code? Or this is bug in Windows?
Code is here: https://github.com/DJm00n/cppwinrtgamepad
Using 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: I also tried UWP Simple3DGameXaml
app from https://github.com/microsoft/Windows-universal-samples repo - and both controllers works in it.
This is a known issue. Apparently this is caused by how focus handling works. Windows.Gaming.Input basically doesn't work for console apps as a result, but does work for Win32 or UWP apps that have a window in focus.
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.
If you need game controller support for a legacy Win32 console app, you should use XINPUT. See this blog post.