【发布时间】:2016-07-16 15:38:19
【问题描述】:
所以我在 DLL 中有这个 c++ 函数
__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
但由于某种原因,lParam 在 C++ 端的值总是不同的。
我本例 0x004fe95c = 5237084
有人知道为什么会这样吗?
【问题讨论】:
-
您的 pinvoke 声明与您的 C 函数不匹配。可能是因为 MouseRawData 声明,我们没有看到它的好处,返回结构的函数总是很棘手。改用 bool GetMouseRawData(LPARAM lParam, MOUSERAWDATA* data)。
标签: c# c++ pinvoke native unmanaged