Так что я это Си ++ в DLLP/Invoke изменяет значения переданных аргументов
__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# проекта:
[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 на значение lParam на стороне C++ всегда разные.
Я этот случай 0x004fe95c = 5237084
Любой знает, почему это происходит?
Ваше объявление PInvoke не совпадает с функцией C. Вероятно, из-за декларации MouseRawData у нас есть преимущество не видеть, функции, возвращающие структуру, всегда сложны. Вместо этого используйте bool GetMouseRawData (данные LPARAM lParam, MOUSERAWDATA *). –