C# DirectInput - 确定游戏手柄控制器类型

Posted

技术标签:

【中文标题】C# DirectInput - 确定游戏手柄控制器类型【英文标题】:C# DirectInput - Determining a gamepad controller type 【发布时间】:2010-07-14 12:42:12 【问题描述】:

我正在尝试使用 DirectInput API 在我的应用程序中使用各种游戏手柄控制器。据我所知,轴在设备之间的映射方式不同。

除了使用 DeviceInformation.ProductName/InstanceName 来区分控制器以允许不同的轴控制分配之外,是否有一种常用的方法来确定控制器类型?

【问题讨论】:

【参考方案1】:

如果您只需要知道控制器类型(FirstPerson、Joystick、Gamepad...),请使用 DeviceInformation.DeviceType。

要知道连接了哪个特定控制器,请使用 ProductName 或更好的 ProductGuid。对于两个不同的控制器,ProductName 可能相同。另一方面,即使对于相同生产费用的两个控制器,ProductGuid 也可能不同。

只有使用 ProductGuid,您才能毫无疑问地识别连接的设备实例。

人们可能会想通过dev.GetObjects(DeviceObjectTypeFlags.Axis) 查找并检查轴的名称(和偏移量),但不能保证名为“X 轴”的轴确实映射到someDevice.CurrentJoystickState.X

您要么必须自己为将要连接的任何控制器预先完成所有映射(只有在您自己开发应用程序时才可接受)并将该信息存储在应用程序的配置文件中,否则您将需要提供某种形式,用户可以自己映射新设备。我目前正在开发这个,但这个答案会超出这个问题的范围......

还请考虑,为了获取此基本信息(如 ProductGuid),您不必创建设备。这些属性已在 DeviceInstance 中可用(在 Microsoft.DirectX.DirectInput.Manager.GetDevices() 的 DeviceList 中)...


更新:因为我自己的回答一直困扰着我,所以我更深入地探讨了这个话题。 所以这里有一种方法来确定哪些轴映射到哪些值:

// loop through the axes of an acquired device:
foreach (DeviceObjectInstance doi in 
    _currentDevice.GetObjects(DeviceObjectTypeFlags.Axis))

    doi.Name; // the name of the axis, e.g. 'X-Achse' (that's a german device...)
    doi.Offset / 4; // the enumeration 'index' of the axis
    doi.UsagePage; // the UsagePage determines the context of the axis value
    // vvvv
    doi.Usage; // the Usage tells you which JoystickState field to map to.
    // ^^^^

到目前为止,我发现了这些使用价值表示:

(with JoystickState s = _currentDevice.CurrentJoystickState)
  Usage   Axis value
   48      s.X
   49      s.Y
   50      s.Z
   51      s.Rx
   52      s.Ry
   53      s.Rz
   54      s.GetSlider()[0]

所以使用switch(doi.Usage)可以自动获取对应的轴值。

【讨论】:

从 Usage 到 DirectInput 轴的完整映射在此站点上:msdn.microsoft.com/en-us/windows/hardware/gg487464.aspx。另外,doi.Guid 直接包含目标映射。 这些使用代码来自 USB 使用表:有关详细信息,请参阅 usb.org/developers/devclass_docs/Hut1_12v2.pdf。如果您正在编写飞行模拟程序、锻炼机软件或想要支持光枪、头部跟踪器或手套等外来输入,这些将派上用场。

以上是关于C# DirectInput - 确定游戏手柄控制器类型的主要内容,如果未能解决你的问题,请参考以下文章

将游戏手柄数据传递到 Windows

使用 DirectInput 在 C# 中检索键盘状态?

如何在 Linux 中从 Mono/C# 访问游戏杆/游戏手柄?

如何制作小游戏

带有游戏手柄的 Stellaris 伺服控制

如何使用 pyusb 控制 Xbox 360 游戏手柄上的 LED