2010-07-14 41 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