簡體   English   中英

如何在C#中讀取Win32 WM_MOVE lParam x,y坐標?

[英]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_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))

重要的是這些值必須經過簽名,因為輔助監視器返回負值作為坐標。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM