C++ 在WM_LBUTTONDOWN消息中获取鼠标坐标

C++ 在WM_LBUTTONDOWN消息中获取鼠标坐标,c++,winapi,C++,Winapi,MSG的结构如下: typedef struct tagMSG { HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; } MSG, *PMSG; long WINAPI WndProc(HWND hWnd, UINT iMessage, UINT wParam, LONG lParam) 消息过程如下所示: typedef struct

MSG
的结构如下:

typedef struct tagMSG {
  HWND   hwnd; 
  UINT   message; 
  WPARAM wParam; 
  LPARAM lParam; 
  DWORD  time; 
  POINT  pt; 
} MSG, *PMSG; 
long WINAPI WndProc(HWND hWnd, UINT iMessage, UINT wParam, LONG lParam)

消息过程如下所示:

typedef struct tagMSG {
  HWND   hwnd; 
  UINT   message; 
  WPARAM wParam; 
  LPARAM lParam; 
  DWORD  time; 
  POINT  pt; 
} MSG, *PMSG; 
long WINAPI WndProc(HWND hWnd, UINT iMessage, UINT wParam, LONG lParam)
我的问题:在消息过程中,为什么不将
变量传递给窗口过程,以及如何找到鼠标的
?通过
GetCursorPos()
?我发现一些例子是通过
LOWORD(lParam)和HIWORD(lParam)
直接获取的。。你能告诉我有关它的信息吗?谢谢你

我看到有人写了这个,对吗?我不确定:

RECT rect1;
long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam)
{
    HDC hDC;        
    WORD x,y;   
    PAINTSTRUCT ps;     

    x = LOWORD(lParam); 
    y = HIWORD(lParam);

    switch(iMessage)
    {
    case WM_LBUTTONDOWN:
        if(wParam&MK_CONTROL)
        {
            rect1.left = x; 
            rect1.top = y;
        }
        else if(wParam&MK_SHIFT)
        {
            rect1.left = x; 
            rect1.top = y;
        }
        break;

    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    default:
        return(DefWindowProc(hWnd,iMessage,wParam,lParam));
    }
    return 0;
}

坐标不会消失。它们位于
lParam
中。见:

在process函数中,为什么不将POINT变量传递给process函数,以及如何找到鼠标的点

如果您确实需要,可以使用单独的函数来检索该信息。大多数消息处理程序不处理鼠标输入,为几乎永远不会使用它们的消息处理程序传递额外参数也没有意义。(可以说,
WndProc
可以定义为采用
MSG*
;我不知道其设计的原因,但我猜随着时间的推移,成员被添加到
MSG
结构中。)

通过GetCursorPos()实现

否。
GetCursorPos
将返回光标的当前位置,该位置可能与生成消息时的位置不同。你反而想要。(这类似于。)


类似地,消息处理程序可以通过获取消息时间。

问题的前半部分与第二部分有什么关系?我只想说,当我们获取消息(xx)时,我们得到了鼠标点,但在处理函数中,它消失了,windows为什么这样做?我的英语很差,我说的很清楚吗?谢谢你…我可以根据你的头衔投反对票吗;我还把你的“进程函数”改成了“窗口过程”,因为它只会让事情变得更加混乱。是的,它是对的,因为它仅限于WM_MOUSEMOVE,它不属于鼠标的消息,比如WM_KEYDOWN,WM_CHAR,那么我也可以这样做吗?xPos=GET_X_LPARAM(LPARAM);yPos=获取Y LPARAM(LPARAM);谢谢你的回答…你为什么不读一下和?这个更新如何使问题不同?如果我们不知道代码应该做什么,如果
rect1
未定义,我们如何知道代码是否正确?哦,对不起,我忘了rect1是在进程函数RECT rect1之前定义的@Tu先生:在您的示例中,
lParam
wParam
的含义取决于消息类型,因此在检查消息类型之前尝试提取坐标数据是非常误导的。使用
LOWORD
HIWORD
提取坐标也是错误的;您需要使用
GET_X_LPARAM
GET_Y_LPARAM
正确处理多监视器系统上的负坐标。。做这件事是没有办法的。。LPRAM的高位是x,低位是y(如果内存正常)。看@johnathon:嗯?是的,这些宏是
GET_X_LPARAM
GET_Y_LPARAM
,正如我在评论中提到的(以及您链接到的页面上提到的)。