C#DirectInput-确定gamepad控制器类型

C#DirectInput-确定gamepad控制器类型,c#,directinput,C#,Directinput,我正在尝试使用DirectInputAPI在我的应用程序中使用各种gamepad控制器。据我所知,设备之间的轴映射不同 除了使用DeviceInformation.ProductName/InstanceName来区分控制器以允许不同的轴控制分配之外,是否有一种确定控制器类型的常用方法 如果您只需要知道控制器类型(第一人称、操纵杆、游戏板等),请使用DeviceInformation.DeviceType 要知道连接了哪个特定控制器,请使用ProductName或更好的ProductGuid。对

我正在尝试使用DirectInputAPI在我的应用程序中使用各种gamepad控制器。据我所知,设备之间的轴映射不同


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

如果您只需要知道控制器类型(第一人称、操纵杆、游戏板等),请使用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]

因此,使用
开关(doi.Usage)
可以自动获得相应的轴值。

如果您只需要知道控制器类型(第一人称、操纵杆、游戏板等),请使用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]

因此,使用
开关(doi.Usage)
可以自动获得相应的轴值。

从使用到DirectInput轴的完整映射位于以下站点:。另外,
doi.Guid
直接包含目标映射。这些使用代码来自USB使用表:有关详细信息,请参阅。如果您正在编写飞行sim卡、运动机器软件或希望支持像光枪、头部跟踪器或手套这样的外来输入,这些将非常有用。从使用到DirectInput轴的完整映射位于以下网站:。另外,
doi.Guid
直接包含目标映射。这些使用代码来自USB使用表:有关详细信息,请参阅。如果你正在编写飞行模拟卡、运动机器软件,或者想要支持像光枪、头像追踪器或手套这样的外来输入,这些都会派上用场。