2

winmm dll を使用してジョイスティックからの入力をキャプチャしたい.. DLL のインポートと操作に関する知識があまりありません。

私はそれをやろうとしましたが、私はそれを行う方法がわかりません..

[DllImport("winmm.dll")]
public static extern string joyGetPosEx(uint dev, JoyinfoEx ) //Something Similar

DLL から joyinfoEx 構造体を取得し、それを JoygetPosEx .. に入れるにはどうすればよいですか? :S

4

2 に答える 2

4

あなたの質問が示唆するように、joyGetPosExから関数をインポートする必要がありますwimmm.dll。これは、ネイティブの Win32 API (または「プラットフォーム」DLL) から関数を呼び出すため、P/Invokingと呼ばれることがよくあります。その関数を使用する必要があることは既にわかっているので、もっと注意深く見てみましょう。

その関数のドキュメントには、次の 2 つのパラメーターが必要であることが示されています。

  • 最初の ( ) は、照会するジョイスティックを識別するuJoyID単純な(または整数の) 値です。int

  • 2 番目 ( pji) は最初よりも少し複雑で、これがあなたが苦労していた部分だと思います。標準の値型ではなく、 と呼ばれるJOYINFOEX構造体であり、コードでその構造体を定義する必要があります。関数が行うことは、joyGetPosExその特別な構造体にジョイスティックの位置に関する情報を入力して、さまざまな値を一度に返すことができるようにすることです。そのため、参照 ( ref) として渡す必要があります。関数は実際に、渡された構造体のインスタンスに一連の値を格納するためです。コードは、構造体のインスタンスを含む変数からこれらの値を読み取ることができます。

    その構造のドキュメントが利用可能ですここ
    で、各メンバーの名前とデータ型を示します。DWORDaを として扱うことができるため、intその宣言は次のようになります。

    [StructLayout(LayoutKind.Sequential)]
    public struct JOYINFOEX 
    {
        public int dwSize; 
        public int dwFlags; 
        public int dwXpos; 
        public int dwYpos; 
        public int dwZpos; 
        public int dwRpos; 
        public int dwUpos; 
        public int dwVpos; 
        public int dwButtons; 
        public int dwButtonNumber; 
        public int dwPOV; 
        public int dwReserved1; 
        public int dwReserved2; 
    }
    

最後に、joyGetPosEx関数は type の値を返しますint。この値は、関数が成功したかどうかを示し、失敗した場合は正確に何が問題だったかを示します。エラーコードです。上記のリンクのドキュメントには、返される可能性のあるすべての値の表が示されています。これらの値をチェックしたい場合は、コードで定数として定義する必要があります。

public const int JOYERR_BASE = 160
public const int JOYERR_PARMS = (JOYERR_BASE + 5); 
public const int JOYERR_UNPLUGGED = (JOYERR_BASE + 7);
public const int MMSYSERR_BASE = 0;
public const int MMSYSERR_BADDEVICEID = (MMSYSERR_BASE + 2); 
public const int MMSYSERR_INVALPARAM = (MMSYSERR_BASE + 11); 

したがって、上記を考えると、最終的な関数定義は次のようになります。

[DllImport("winmm.dll")]
public static extern int joyGetPosEx(int uJoyID, ref JOYINFOEX pji);

将来的には、これらの Win32 API 関数をコードで定義および宣言する方法のリファレンスとしてpinvoke.netを覚えておいてください。たまたまjoyGetPosEx機能がありません (または、少なくとも私が見つけたものではありません) が、通常は必要なものがほとんどすべて揃っています。それが失敗した場合は、上記で説明したように実行できます。関数の元のドキュメントを見て、.NET で動作するように定義するようにしてください。

于 2010-12-11T14:16:31.557 に答える
3

この関数は、2 番目の引数を介してデータを返します。戻り値は整数で、考えられるエラーを示します。適切な宣言は次のとおりです。

    [DllImport("winmm.dll")]
    private static extern int joyGetPosEx(int joystickNumber, ref JOYINFOEX info);

次のように構造を宣言する必要があります。

    [StructLayout(LayoutKind.Sequential)]
    private struct JOYINFOEX {
        public int dwSize;
        public int dwFlags;
        public int dwXpos;
        public int dwYpos;
        public int dwZpos;
        public int dwRpos;
        public int dwUpos;
        public int dwVpos;
        public int dwButtons;
        public int dwButtonNumber;
        public int dwPOV;
        public int dwReserved1;
        public int dwReserved2;
    }

サンプル呼び出し:

        JOYINFOEX info = new JOYINFOEX();
        info.dwSize = Marshal.SizeOf(info);
        int err = joyGetPosEx(1, ref info);
        if (err != 0) reportError(err);
        else {
            int xpos = info.dwXpos;
            // Do something with xpos
            //...
        }
于 2010-12-11T14:22:27.997 に答える