如何在 C# 中读取 Win32 WM_MOVE lParam x,y 坐标?

Nab*_*ilS 3 c# pinvoke winapi

我正在尝试从 WM_MOVE win32 消息读取 lParam x 和 y 坐标并获得奇怪的值。我需要以某种方式从 lParam IntPtr 中提取它们。

https://msdn.microsoft.com/en-us/library/windows/desktop/ms632631(v=vs.85).aspx

谢谢

Jim*_*imi 5

除了 Simon Mourier 已经发布的内容(涵盖许多标准宏)之外,此方法还Point()message.LParam.

MSDN 建议使用GET_X_LPARAMGET_Y_LPARAM宏(在 中定义WindowsX.h)来提取坐标,并警告 和LOWORDHIWORD (在 中定义WinDef.h)可能返回错误结果,因为它们返回无符号整数。

这些是建议的宏的定义:

#define GET_X_LPARAM(lp)    ((int)(short)LOWORD(lp))
#define GET_Y_LPARAM(lp)    ((int)(short)HIWORD(lp))
Run Code Online (Sandbox Code Playgroud)

重要的是这些值必须有符号,因为辅助监视器返回负值作为坐标。

public static Point PointFromLParam(IntPtr lParam)
{
    return new Point((int)(lParam) & 0xFFFF, ((int)(lParam) >> 16) & 0xFFFF);
}
Run Code Online (Sandbox Code Playgroud)