あなたの質問が示唆するように、joyGetPosEx
から関数をインポートする必要がありますwimmm.dll
。これは、ネイティブの Win32 API (または「プラットフォーム」DLL) から関数を呼び出すため、P/Invokingと呼ばれることがよくあります。その関数を使用する必要があることは既にわかっているので、もっと注意深く見てみましょう。
その関数のドキュメントには、次の 2 つのパラメーターが必要であることが示されています。
最初の ( ) は、照会するジョイスティックを識別するuJoyID
単純な(または整数の) 値です。int
2 番目 ( pji
) は最初よりも少し複雑で、これがあなたが苦労していた部分だと思います。標準の値型ではなく、 と呼ばれるJOYINFOEX
構造体であり、コードでその構造体を定義する必要があります。関数が行うことは、joyGetPosEx
その特別な構造体にジョイスティックの位置に関する情報を入力して、さまざまな値を一度に返すことができるようにすることです。そのため、参照 ( ref
) として渡す必要があります。関数は実際に、渡された構造体のインスタンスに一連の値を格納するためです。コードは、構造体のインスタンスを含む変数からこれらの値を読み取ることができます。
その構造のドキュメントが利用可能ですここ
で、各メンバーの名前とデータ型を示します。DWORD
aを として扱うことができるため、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 で動作するように定義するようにしてください。