2010-07-14 163 views
2

我试图在我的应用程序中使用各种手柄控制器,使用DirectInput API。从我所知道的情况来看,各个设备之间的坐标轴是不同的。C#DirectInput - 确定一个游戏手柄控制器类型

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

回答

0

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

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

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

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

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

想一想,为了得到这个基本信息(作为ProductGuid),你不必创建一个设备。这些属性已经可以在(从Microsoft.DirectX.DirectInput.Manager.GetDevices()的DEVICELIST范围内)DeviceInstance ...


更新:因为我自己的答案是唠叨我,我跳入话题更多一点。
因此,这里是一种方法来确定哪些轴映射到其值:

// 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)就可以自动获得相应的轴值。

+0

从Usage到DirectInput轴的完整映射位于此站点上:http://msdn.microsoft.com/en-us/windows/hardware/gg487464.aspx。另外,'doi.Guid'直接包含目标映射。 – 2012-08-13 15:16:33

+0

这些使用代码来自USB使用表:有关详细信息,请参见http://www.usb.org/developers/devclass_docs/Hut1_12v2.pdf。如果您正在编程飞行模拟器,运动机器软件或想要支持异形输入,如光枪,头部跟踪器或手套,这些将派上用场。 – 2012-08-13 15:31:04