请问如何判断鼠标消息是否在窗口内?我知道如何拦截窗口外鼠标,但是不知道拦截到了之后LOWORD(lParam)和HIWORD(lParam)的值是窗口坐标的值还是屏幕坐标的值,要怎么判断呢?还有就是在窗口外拦截后产生的消息是MOUSEMOVE吗??

鼠标在窗口内移动产生的是MOUSEMOVE消息没错啊

获得当前鼠标所在的坐标值,然后与窗口坐标比较,就能判断是不是在窗口内了。

1.PtInRect
2.对于客户区消息是窗口坐标,对于非客户区消息是屏幕坐标。
3.窗口过程通常只响应鼠标处于客户区和非客户区的消息,对于窗口外的消息需要自己手动捕获。

谢谢你们回答我的问题,我想补充以下问题会比较清楚,我现在是想在一个没有标题栏的窗口上实现像内定窗口那样的移动功能,也就是说我设了一个和一般标题栏大小位置一样的区域在窗口上方
RE  anarki1234 :但是我还有些没有搞明白,你说获得鼠标现在的坐标值去和窗口坐标做对比,但是前提是我必须知道此刻我捕捉的是不是窗口外消息(因为屏幕坐标和显示区域坐标是不一样的),我要如何判断现在我捕获的是不是窗口内的消息。
RE eternalkid :我现在已经捕捉了窗口外的消息,但是问题就是捕捉完产生的消息类型是什么?坐标值是显示区域坐标还是屏幕坐标?

你若是只想实现类标题栏的移动功能,直接处理WM_NCHITTEST就可以了。
因为是非客户区的消息,所以获得的LPARAM里面存储的鼠标坐标是屏幕坐标。

现在我是这么写:
case WM_NCHITTEST:
ptTitle.x=393;
ptTitle.y=26;
ScreenToClient(hwnd,&ptTitle);
ptMouse.x=LOWORD(lParam);
ptMouse.y=HIWORD(lParam);

if((ptMouse.x <ptTitle.x)&&(ptMouse.x>0)&&(ptMouse.y>0)&&(ptMouse.y <ptTitle.y))
{  Rectangle (hdc, 0, 0, 100, 100) ;
InvalidateRect(hwnd,NULL,FALSE);
return HTCAPTION;

}

那如果热点不在我定义的这个范围内的话这个消息要返回什么呢?

首先你的代码里有个错误:

引用 7 楼 old_guy 的回复:
现在我是这么写:
case WM_NCHITTEST:
ptTitle.x=393;
ptTitle.y=26;

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

ScreenToClient(hwnd,&ptMouse);

if((ptMouse.x <ptTitle.x)&&(ptMouse.x>0)&&(ptMouse.y>0)&&(ptMouse.y <ptTitle.y))
{  Rectangle (hdc, 0, 0, 100, 100) ;
InvalidateRect(hwnd,NULL,FALSE);
return HTCAPTION;

}

那如果热点不在我定义的这个范围内的话这个消息要返回什么呢?…


需要转化成窗口坐标的应该是你的鼠标坐标才对。
剩下的交给你重载的默认的窗口过程处理就行了啊!

很谢谢你的回答,但是我用的是C语言,没有重载这个概念,我不知道C语言要怎么处理。你可以加下我的Q吗?573301735
还有一个问题就是,我在程序里响应鼠标按键消息,按钮(自己画的按钮)的区域在  WM_NCHITTEST 响应里要返回什么值程序才能收到WM_LBUTTONDOWN消息?

很麻烦你,我再开个帖子给分

如果你是用的纯C,没用VCL和MFC,那么你的窗口过程函数因该是类似以下形式:

C/C++ code
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { ……..//定义变量 switch(message) { case WM_NCHITTEST: ……//处理消息 } [color=#FF0000]return DefWindowProc(hwnd,message,wParam,lParam);//这就是系统默认窗口过程函数,用这个返回就好[/color] }