2

问题:我想读取 c# 下的游戏手柄/操纵杆输入,并希望能够知道按下了哪个键。(至少有几个游戏手柄型号)

Google 和 stackoverflow 充满了不同的过时解决方案,其中大多数是在 2011 年提出的。一些流行的库,如SharpDXSlimDX已经被废弃并且不受支持。

我最终使用了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模式则完全不同。

我看到了很多用于游戏手柄的键盘映射程序——它们几乎可以理解任何设备。所以有一些方法可以做正确的事情。

也许有人可以建议至少一些关于如何使用游戏手柄或如何解释原始数据(带有真实世界的例子)的文档?

4

1 回答 1

0

这取决于平台和框架。

唯一完全支持这一点的框架是带有GamePad API的 UWP 。

对于 .NET Framework、.NET Core 和 .NET,您需要依赖 P/Invoke 或自定义实现或 3rd 方库。对于 WPF,我发现了这个

我需要用 Xbox One S 控制器控制 Raspberry Pi 遥控车。在 Linux 上,对应于游戏手柄(操纵杆)的文件/dev/input/js[x]x 数字(例如/dev/input/js0)(文档)的位置。这现在被认为是遗留的,建议evdev改用 Linux ( docs )。

GitHub 上有一个 .NET Core,用于 Linux 上的游戏手柄。它不断读取/dev/input/js0文件并根据数据引发事件。它还包含一个工作样本。查看实现将使您了解如何解释原始数据。

于 2022-01-07T10:24:11.083 回答