Also ich habe diese C++ Funktion in einem DLLP/Invoke ändert die Werte der übergebenen Argumente
__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;
}
und folgenden in meinem C# -Projekt:
[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;
}
}
Wenn ich diesen Code ausführen, der folgende Wert wird auf die GetMouseRawData geben
Aber für einige reas auf den Wert von lParam auf der C++ Seite ist immer anders.
ich diesen Fall 0x004fe95c = 5237084
Wer weiß, warum dies geschieht?
Ihre pinvoke Erklärung nicht mit Funktion Ihre C. Wahrscheinlich haben wir aufgrund der MouseRawData-Deklaration den Vorteil, sie nicht zu sehen, Funktionen, die eine Struktur zurückgeben, sind immer schwierig. Favor bool GetMouseRawData (LPARAM LParam, MOUSERAWDATA * Daten) stattdessen. –