[英]How do I read the Win32 WM_MOVE lParam x,y coordinates in C#?
我試圖從WM_MOVE win32消息中讀取lParam x和y坐標,並得到奇怪的值。 我需要以某種方式從lParam IntPtr中提取它們。
https://msdn.microsoft.com/zh-CN/library/windows/desktop/ms632631(v=vs.85).aspx
謝謝
除了Simon Mourier已發布的內容(涵蓋了許多標准宏)之外,此方法還從message.LParam
返回Point()
。
MSDN建議使用
GET_X_LPARAM
和GET_Y_LPARAM
宏(在WindowsX.h
定義)來提取坐標,警告LOWORD
和HIWORD
宏(在WinDef.h
定義)返回的可能錯誤結果,因為它們返回無符號整數。
這些是建議的宏的定義:
#define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp))
#define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp))
重要的是這些值必須經過簽名,因為輔助監視器返回負值作為坐標。
public static Point PointFromLParam(IntPtr lParam)
{
return new Point((int)(lParam) & 0xFFFF, ((int)(lParam) >> 16) & 0xFFFF);
}
Windows消息中的坐標通常是兩個帶符號的16位數字,打包成一個32位數字。
理想情況下,您應該將這些提取為模擬GET_X_LPARAM
/ GET_Y_LPARAM
宏的GET_X_LPARAM
符號數字:
IntPtr lparam = (IntPtr) 0xfffeffff; // -1 x -2 example coordinate
uint lparam32 = (uint) lparam.ToInt64(); // We want the bottom unsigned 32-bits
short x = (short) (((uint)lparam32) & 0xffff);
short y = (short) ((((uint)lparam32) >> 16) & 0xffff);
Console.WriteLine(string.Format("coordinates: {0} x {1}", x, y));
在WM_MOVE
的情況下,您也可以將它們提取為無符號數字( ushort
),因為工作區永遠不會為負數。
.NET參考源是金礦。 在內部System.Windows.Forms.NativeMethods + Util類中,您將找到這些幫助程序,它們與WM_MOVE文檔的用法相同(高位字= HIWORD,低位字= LOWORD等)。
public static int MAKELONG(int low, int high) {
return (high << 16) | (low & 0xffff);
}
public static IntPtr MAKELPARAM(int low, int high) {
return (IntPtr) ((high << 16) | (low & 0xffff));
}
public static int HIWORD(int n) {
return (n >> 16) & 0xffff;
}
public static int HIWORD(IntPtr n) {
return HIWORD( unchecked((int)(long)n) );
}
public static int LOWORD(int n) {
return n & 0xffff;
}
public static int LOWORD(IntPtr n) {
return LOWORD( unchecked((int)(long)n) );
}
public static int SignedHIWORD(IntPtr n) {
return SignedHIWORD( unchecked((int)(long)n) );
}
public static int SignedLOWORD(IntPtr n) {
return SignedLOWORD( unchecked((int)(long)n) );
}
public static int SignedHIWORD(int n) {
int i = (int)(short)((n >> 16) & 0xffff);
return i;
}
public static int SignedLOWORD(int n) {
int i = (int)(short)(n & 0xFFFF);
return i;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.