0

SlimDXで奇妙な問題が発生しました:これはWindows 7で確認されており、他のバージョンはまだテストされていません:安価なUSBゲームパッド(シリアル番号なし)のバンドルを使用していますが、1つの物理的なゲームパッドが終了することがあります複数のJoystickオブジェクトに入力を提供します。

シナリオは次のとおりです。

  1. ゲームパッド1をハブスロット1に接続します。パッドはDirectInput.GetDevicesGUIDf17b2d30として表示されます。Joystickパッドのオブジェクトを作成します。
  2. ゲームパッド2をハブスロット2に接続します。パッドはDirectInput.GetDevicesGUID5187d2d0として表示されます。Joystickパッドのオブジェクトを作成します。
  3. ゲームパッド2のボタンを押します。状態に変更はありません。
  4. ゲームパッド1のボタンを押します。ボタンは両方のオブジェクトのGetCurrentState()後に設定されて表示されます。Poll()
  5. オブジェクトのゲームパッド2.Poll()メソッドのプラグを抜くと、エラーなしで戻り続けますが、に表示されなくなりますDirectInput.GetDevices
  6. ゲームパッド1のボタンを押します。ボタンは両方のオブジェクトのGetCurrentState()後に設定されて表示されます。Poll()

デバッガーでオブジェクトを調べました。それぞれJoystickが正しいGUIDを参照しますInformation.InstanceGUIDが、それぞれがで同じUSBパスを持っていますProperties.InterfacePath

ゲームパッドのハードウェアは正しく機能しているようです-コントロールパネルのジョイスティックテスターで同じシーケンスを実行すると、ゲームパッドは区別されたままになります。

DirectInput GUIDは、USB PIDとVIDに基づいて割り当てられているようです。次に、接続されているUSBポートへの物理パスではなく、同じゲームパッドが接続されている順序です。異なるモデルのゲームパッドを組み合わせると、問題は解決します。

SlimDXまたはDirectInputのバグのように感じます-これに対する回避策はありますか?

4

2 に答える 2

4

ここでの私の最後の答えは、DirectInputを完全に削除し、RawInputに移動することでした。C#コードとRawInputの間のインターフェイスに小さなCDLLを実装しました。

私には2つの制限がありました:デバイス名を見つけるのに問題があることと、XPでデバイス情報を読み取るときにクラッシュすることです。これらはどちらも私のアプリケーションにとって重大な問題ではありません。

サンプルのC++ソースコードは答えに収まるには少し長いので、ここにあります

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);
于 2012-10-20T13:33:02.563 に答える
-5

私はあなたが使うべきだと思います:

Joystick joy;
string UniquePathForEachJoystick = joy.Properties.InterfacePath.ToString();
于 2015-03-10T03:24:25.273 に答える