2012-09-27 119 views
0

我對SlimDX有一個好奇的問題:我們已經在Windows 7上看到了這一點,並且尚未測試其他版本:我正在使用一捆廉價USB遊戲手柄(無序列號),有時一個物理遊戲手柄最終將輸入提供給多個對象。SlimDX:Joystick.Poll()成功斷開遊戲手柄

的方案是:

  1. 插件在手柄1至轂插槽1墊出現在DirectInput.GetDevices作爲GUID f17b2d30。爲pad創建Joystick對象。
  2. 將遊戲手柄2插入到集線器插槽2中。手柄將作爲GUID 5187d2d0出現在DirectInput.GetDevices中。爲pad創建Joystick對象。
  3. 按下游戲手柄2上的按鈕。沒有改變狀態。
  4. 按下游戲手柄1上的按鈕。在兩個對象上的Poll()之後,按鈕出現在GetCurrentState()中。
  5. 拔下手柄2. Poll()對其方法繼續無誤地返回,但不再出現在DirectInput.GetDevices中。
  6. 按下游戲手柄1上的按鈕。在兩個對象上的Poll()之後,按鈕出現在GetCurrentState()中。

我已經檢查了調試器中的對象。每個Joystick引用Information.InstanceGUID的正確GUID,但每個在Properties.InterfacePath中都有相同的USB路徑。

遊戲手柄硬件似乎工作正常 - 如果我使用控制面板遊戲杆測試儀執行相同的操作,遊戲手柄保持不同。

DirectInput GUID似乎是基於USB PID和VID分配的,然後是插入相同遊戲手柄的順序,而不是它們插入的USB端口的物理路徑。如果我混合使用不同型號的遊戲手柄,問題就會消失。

感覺就像一個SlimDX甚至是一個DirectInput錯誤 - 是否有解決方法?

回答

3

我的最終答案是完全放棄DirectInput,然後轉移到RawInput。我實現了一個小的C DLL來連接我的C#代碼和RawInput。

我有兩個限制:trouble finding device namesa crash reading device information under XP。這些都不是我的應用程序的關鍵問題。

示例C++源代碼有點長,以適應答案so is here

從C#調用使用這些簽名:

[DllImport("Adapters.dll", CallingConvention = CallingConvention.Cdecl)] 
    private static extern int InitialiseGamepads(IntPtr hwnd); 
    [DllImport("Adapters.dll", CallingConvention = CallingConvention.Cdecl)] 
    private static extern IntPtr GetDevicePath(int index); 
    [DllImport("Adapters.dll", CallingConvention = CallingConvention.Cdecl)] 
    private static extern int PollDeviceChange(); 
    [DllImport("Adapters.dll", CallingConvention = CallingConvention.Cdecl)] 
    private static extern int ProcessInput(IntPtr wParam, IntPtr lParam, 
     out byte buttons, out int x, out int y); 
+0

好了,你會與他人共享您的實現? –

+0

@ d.popov編輯添加鏈接到源代碼。 –

+0

謝謝!你能分享Adapters.dll嗎? –

-5

我想,你應該使用:

Joystick joy; 
string UniquePathForEachJoystick = joy.Properties.InterfacePath.ToString(); 
+1

小心解釋爲什麼這將有助於解決原始問題? – mjuarez