Если вам просто нужно знать тип контроллера (FirstPerson, Joystick, Gamepad, ...), используйте DeviceInformation.DeviceType.
Чтобы узнать, какой конкретный контроллер подключен, используйте ProductName или лучше ProductGuid. ProductName может быть одинаковым для двух разных контроллеров. С другой стороны, ProductGuid может отличаться даже для двух контроллеров с одинаковой производственной нагрузкой.
Только с помощью ProductGuid вы можете без сомнения идентифицировать подключенный экземпляр устройства.
Кто-то может испытать желание перейти через dev.GetObjects(DeviceObjectTypeFlags.Axis)
и проверить имена осей (и смещения), но нет гарантии, что ось с именем «Ось X» действительно отображается на someDevice.CurrentJoystickState.X
.
Вы должны будете либо самостоятельно выполнить все сопоставления заранее для любого контроллера, который будет подключен (что приемлемо, только если вы разрабатываете приложение для себя), и сохранить эту информацию в файле конфигурации своего приложения, либо необходимо предоставить некоторую форму, где пользователь может сопоставить новое устройство самостоятельно. Я сейчас разрабатываю именно это, но этот ответ выходит за рамки этого вопроса ...
Учтите также, что для получения этой базовой информации (как ProductGuid) вам не нужно создавать устройство. Эти свойства уже доступны в DeviceInstance (в DeviceList из Microsoft.DirectX.DirectInput.Manager.GetDevices ()) ...
Обновление: Поскольку мой собственный ответ не давал мне покоя, я углубился в тему.
Итак, вот способ определить, какие оси сопоставлять с какими значениями:
// 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)
, вы можете автоматически получить соответствующее значение оси.