の値を変更するので、私はDLLP /呼び出しは、渡された引数
__declspec(dllexport) MOUSERAWDATA __stdcall GetMouseRawData(LPARAM lParam)
{
UINT bufferSize = 0;
BYTE *buffer = new BYTE[bufferSize];
GetRawInputData((HRAWINPUT)lParam, RID_INPUT, NULL, &bufferSize, sizeof(RAWINPUTHEADER));
GetRawInputData((HRAWINPUT)lParam, RID_INPUT, (LPVOID)buffer, &bufferSize, sizeof(RAWINPUTHEADER));
RAWINPUT *raw = (RAWINPUT*)buffer;
MOUSERAWDATA data;
if (raw->header.dwType == RIM_TYPEMOUSE)
{
data.longX = raw->data.mouse.lLastX;
data.longY = raw->data.mouse.lLastY;
}
return data;
}
そして次には、このC++の機能を持っている私のC#プロジェクトである:
[DllImport("RawInput.dll", CallingConvention = CallingConvention.StdCall)]
private static extern MouseRawData GetMouseRawData(IntPtr lParam);
.
.
.
protected override void WndProc(ref Message m)
{
switch(m.Msg)
{
case WM_CREATE:
if (AttachMouseListener(this.Handle))
Console.WriteLine("It works!");
break;
case WM_INPUT:
MouseRawData data = GetMouseRawData(m.LParam);
break;
default:
base.WndProc(ref m);
break;
}
}
私はこのコードを実行すると、以下の値がGetMouseRawData
しかし、いくつかのREASのために渡され、 C++側のlParamの値は常に異なっています。
これがなぜ起こるか私は、この場合の0x004fe95c = 5237084
誰もが知っていますか?
あなたのPInvoke宣言があなたのCの関数と一致していません。おそらく、MouseRawData宣言のために、それを見ないという利点があります。構造体を返す関数は、常に難しいです。代わりに、GetMouseRawData(LPARAM lParam、MOUSERAWDATA * data)を使用してください。 –