问题:我想读取 c# 下的游戏手柄/操纵杆输入,并希望能够知道按下了哪个键。(至少有几个游戏手柄型号)
Google 和 stackoverflow 充满了不同的过时解决方案,其中大多数是在 2011 年提出的。一些流行的库,如SharpDX或SlimDX已经被废弃并且不受支持。
我最终使用了SharpLibHid,它弄乱了一些原始输入。我什至取得了一些成功。我正在开发一个 WPF 应用程序,但该库需要来自 winforms 的 WndProc,借助这个技巧https://stackoverflow.com/a/42008211/3348804一切正常。代码很长,你可以在这里获得很好的示例软件:https ://github.com/Slion/SharpLibHid
关键是我能够从中提取此信息SharpLib.Hid.Event
:
InputReport: 0000000F808080800000000000000000000000000202010200020002
DeviceInfo: ShanWan, USB WirelessGamepad
[#Header# dwSize: 52, dwType: RIM_TYPEHID, hDevice: 65610, wParam: 1]
[#Hid# dwCount: 1, dwSizeHid: 28]
[#Keyboard# Message: 251658240, ExtraInformation: 2155905152, Flags: RI_KEY_MAKE, MakeCode: 28, VKey: 0, Reserved: 1]
[#Mouse# usButtonData: 0, usButtonFlags: RI_MOUSE_LEFT_BUTTON_DOWN, lLastX: -2139062144, lLastY: 0, ulButtons: 1, ulExtraInformation: 0, usFlags: 28, ulRawButtons: 251658240]
[KeyId: 1835008, UsageCollection: 5]
UsageValues: [015][128][128][128][128][000][000][000][000][000][000][000][000][000][000][000][000][512][512][513][514]
UsageCollectionNameAndValue: GamePad (0x0005)
通过使用经验方法,我可以观察到一些模式并使用其中一些数据来处理游戏手柄。这根本不是正确的做法。而对于另一个游戏手柄,InputReport
模式则完全不同。
我看到了很多用于游戏手柄的键盘映射程序——它们几乎可以理解任何设备。所以有一些方法可以做正确的事情。
也许有人可以建议至少一些关于如何使用游戏手柄或如何解释原始数据(带有真实世界的例子)的文档?