回答
一:使用SlimDX。
二:它看起來像這樣(其中GamepadDevice
是我自己的包裝,代碼縮小到相關部分)。
查找操縱桿/墊的GUID:
public virtual IList<GamepadDevice> Available()
{
IList<GamepadDevice> result = new List<GamepadDevice>();
DirectInput dinput = new DirectInput();
foreach (DeviceInstance di in dinput.GetDevices(DeviceClass.GameController, DeviceEnumerationFlags.AttachedOnly))
{
GamepadDevice dev = new GamepadDevice();
dev.Guid = di.InstanceGuid;
dev.Name = di.InstanceName;
result.Add(dev);
}
return result;
}
一旦用戶從列表中選擇,獲得遊戲手柄:
private void acquire(System.Windows.Forms.Form parent)
{
DirectInput dinput = new DirectInput();
pad = new Joystick(dinput, this.Device.Guid);
foreach (DeviceObjectInstance doi in pad.GetObjects(ObjectDeviceType.Axis))
{
pad.GetObjectPropertiesById((int)doi.ObjectType).SetRange(-5000, 5000);
}
pad.Properties.AxisMode = DeviceAxisMode.Absolute;
pad.SetCooperativeLevel(parent, (CooperativeLevel.Nonexclusive | CooperativeLevel.Background));
pad.Acquire();
}
輪詢墊看起來是這樣的:
JoystickState state = new JoystickState();
if (pad.Poll().IsFailure)
{
result.Disconnect = true;
return result;
}
if (pad.GetCurrentState(ref state).IsFailure)
{
result.Disconnect = true;
return result;
}
result.X = state.X/5000.0f;
result.Y = state.Y/5000.0f;
int ispressed = 0;
bool[] buttons = state.GetButtons();
由於人們仍然閱讀這個答案,我應該注意到,我後來切換到RawInput:http://stackoverflow.com/a/12988935/184998 – 2013-01-13 21:06:04
到目前爲止我已經獲得作品的部分,我沒有跳過集合級別的呼叫。我在Windows 7.回答其他地方說,微軟建議你使用RawInput而不是DirectInput – Maslow 2016-01-30 16:46:42
壞消息是微軟似乎不再支持DirectX的NET庫,而是專注於XNA。我不在GameDev工作,所以我不需要使用XNA,但是如果您開發電腦遊戲,您可以嘗試。好消息是還有其他方法。一個是SlimDX這個新框架可以幫助你從C#中使用DirectX。另一種方法是直接將「Microsoft.DirectX.dll」和「Microsoft.DirectX.DirectInput.dll」的引用添加到您的項目中。你可以找到它們「.. \ Windows \ Microsoft.NET \ DirectX for Managed Code \」。如果你打算使用最後一種方法,這裏是一個鏈接to codeproject,你可以在這裏閱讀如何使用操縱桿。
編輯: 如果您的應用程序基於NET版本更新,然後2.0應用程序可能會掛起。要解決這個問題變的配置文件,並添加這樣的:
<startup useLegacyV2RuntimeActivationPolicy="true">
既然這是我在谷歌上研究C#遊戲杆/遊戲手柄輸入的熱門,我雖然我應該爲他人發表迴應。
我發現的最簡單的方法是使用SharpDX和DirectInput。您可以通過的NuGet(SharpDX.DirectInput)
安裝它之後,它只是調用幾個方法的問題:
static void Main()
{
// Initialize DirectInput
var directInput = new DirectInput();
// Find a Joystick Guid
var joystickGuid = Guid.Empty;
foreach (var deviceInstance in directInput.GetDevices(DeviceType.Gamepad,
DeviceEnumerationFlags.AllDevices))
joystickGuid = deviceInstance.InstanceGuid;
// If Gamepad not found, look for a Joystick
if (joystickGuid == Guid.Empty)
foreach (var deviceInstance in directInput.GetDevices(DeviceType.Joystick,
DeviceEnumerationFlags.AllDevices))
joystickGuid = deviceInstance.InstanceGuid;
// If Joystick not found, throws an error
if (joystickGuid == Guid.Empty)
{
Console.WriteLine("No joystick/Gamepad found.");
Console.ReadKey();
Environment.Exit(1);
}
// Instantiate the joystick
var joystick = new Joystick(directInput, joystickGuid);
Console.WriteLine("Found Joystick/Gamepad with GUID: {0}", joystickGuid);
// Query all suported ForceFeedback effects
var allEffects = joystick.GetEffects();
foreach (var effectInfo in allEffects)
Console.WriteLine("Effect available {0}", effectInfo.Name);
// Set BufferSize in order to use buffered data.
joystick.Properties.BufferSize = 128;
// Acquire the joystick
joystick.Acquire();
// Poll events from joystick
while (true)
{
joystick.Poll();
var datas = joystick.GetBufferedData();
foreach (var state in datas)
Console.WriteLine(state);
}
}
我希望這有助於。
我甚至得到了這個與DualShock3和MotioninJoy驅動程序一起工作。
這是最容易實現的。感謝你! – 2018-02-11 08:12:12
谷歌在這裏引導我,雖然不是這個問題的要求,OpenTK是Windows和Linux(在單聲道)支持下的一個很好的選擇。
從OpenTK docs,此代碼對樹莓派+ Raspbian +單聲道3.12.0:
for (int i = 0; i < 4; i++)
{
var state = Joystick.GetState(i);
if (state.IsConnected)
{
float x = state.GetAxis(JoystickAxis.Axis0);
float y = state.GetAxis(JoystickAxis.Axis1);
// Print the current state of the joystick
Console.WriteLine(state);
}
}
- 1. 在Java中獲取遊戲杆輸入
- 2. 連接器/遊戲杆輸入問題
- 3. 從USB操縱桿格式化遊戲杆軸信息的方式如何?
- 4. 使用DirectInput插入遊戲杆後接收信號
- 5. pygame.key.set_repeat遊戲杆
- 6. Pygame遊戲杆
- 7. 如何從外部源獲取信息到遊戲中
- 8. 以C語言或Java語言捕捉遊戲杆輸入
- 9. 在cocos2d遊戲中,我如何允許兩個遊戲杆同時輸入?
- 10. 用Python模擬遊戲杆
- 11. 在多人遊戲中從'guest'開車的遊戲杆?
- 12. Cocos2d。數字遊戲杆(遊戲手柄)?
- 13. 從服務器獲取遊戲詳細信息
- 14. C#遊戲杆檢測錯誤
- 15. Swift遊戲錯誤信息
- 16. C#遊戲手柄輸入/輸出類
- 17. 使用圖像獲取遊標信息c
- 18. 從.Net獲取存儲過程信息
- 19. Firebug擴展:從Net Panel獲取信息
- 20. 從令牌c獲取用戶信息#
- 21. 獲取產品信息/ NET
- 22. 獲取.Net字體信息?
- 23. AnalogOnScreenController或用於libGDX的遊戲杆
- 24. Android SDK中的虛擬遊戲杆
- 25. Java中的遊戲杆支持
- 26. C#獲取信息
- 27. 從遊戲模型中獲取圖像
- 28. 獲取的頭信息://輸入
- 29. 獲取您輸入的信息ID
- 30. C#遊戲循環和輸入
誰寫的是我的一個朋友的傢伙。他表示,它不適用於現代.NET。我現在正在通過IM與他交談。 – chris12892 2010-10-14 03:07:25
我從來沒有將遊戲杆編程爲接口設備,但我作爲用戶的理解是,遊戲杆控件映射到鍵盤和鼠標控件(即:當我爲HL2配置Logitech USB PS2樣式控制器時,我將每個按鈕映射到控制器到一個鍵或鼠標按鈕) – 2010-10-14 03:14:57
5年後,當我現在谷歌相同的問題,我發現這個問題提到過時和不工作: – Spiked3 2015-05-19 16:14:20