C++ 如何判断鼠标有没有在窗口上? 纯API 不是MFC

找了不少资料 好像WM_MOUSELEAVE可以实现.. 不过我没有MSDN.. 我需要个WM_MOUSELEAVE实例 比如 MOUSE 离开 window ,window的title 改变成 "鼠标在窗口外" MOUSE回来title 改变成 "鼠标在窗口内" API 不是MFC

示例一:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {

TRACKMOUSEEVENT tme; //定义触发鼠标事件结构
tme.cbSize = sizeof (TRACKMOUSEEVENT); //结构大小
tme.dwFlags = TME_HOVER | TME_LEAVE ; //鼠标停留/鼠标离开
tme.dwHoverTime = 300; //延时300毫秒
tme.hwndTrack = hWnd ; //窗体句柄

switch (message) {
case WM_CREATE: //创建窗口消息
edt = CreateWindow(L"edit", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER,115, 23, 120, 24, hWnd, (HMENU)IDB_EDIT, hInst, NULL); //edit编辑文本框
break;
case WM_MOUSEMOVE :
//鼠标移动消息
TrackMouseEvent(&tme); //调用TrackMouseEvent函数,系统根据tme触发WM_MOUSEHOVER或WM_MOUSELEAVE消息
break ;
case WM_MOUSEHOVER: //鼠标停留消息(这不会自动触发,需要TrackMouseEvent函数来触发)
SetWindowText (edt, _T("鼠标在窗体上面"));
break ;
case WM_MOUSELEAVE : //鼠标离开消息(这不会自动触发,需要TrackMouseEvent函数来触发)
SetWindowText (edt, _T("鼠标已离开窗体"));
break ;
case WM_COMMAND :
break ;
default:
return DefWindowProc(hWnd,
message, wParam, lParam); ;
}
return 0;

}
示例二:
示例一的WM_MOUSEHOVER、WM_MOUSELEAVE貌似只能对窗体有效果,对窗体的子控件就没反应了;因此示例二演示如何实现对窗体上的控件也有效果
wchar_t* MouseHoL(HWND hWnd); //向前声明一个鼠标停留与离开函数
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){

TRACKMOUSEEVENT tme; //定义触发鼠标事件结构
tme.cbSize = sizeof (TRACKMOUSEEVENT); //结构大小
tme.dwFlags = TME_HOVER | TME_LEAVE ; //鼠标停留/鼠标离开
tme.dwHoverTime = 100; //延时100毫秒
tme.hwndTrack = hWnd ; //窗体句柄

switch (message) {
case WM_CREATE: //创建窗口消息
cbtn = CreateWindow(L"button", L"确定", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON | WS_GROUP, 250, 20, 75, 30, hWnd, (HMENU)IDB_BTN,(HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE), NULL); //button按键
edt = CreateWindow(L"edit", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER,115, 23, 120, 24, hWnd, (HMENU)IDB_EDIT, hInst, NULL); //edit编辑文本框
break;
case WM_MOUSEMOVE :
//鼠标移动消息
TrackMouseEvent(&tme); //调用TrackMouseEvent函数,系统根据tme触发WM_MOUSEHOVER或WM_MOUSELEAVE消息
break ;
case WM_MOUSEHOVER: //鼠标停留消息(这不会自动触发,需要TrackMouseEvent函数来触发)
SetWindowText (edt, MouseHoL(cbtn)); //调用MouseHoL函数,判断鼠标是否停留在cbtn窗口
break ;
case WM_MOUSELEAVE : //鼠标离开消息(这不会自动触发,需要TrackMouseEvent函数来触发)
SetWindowText (edt, MouseHoL(cbtn)); //调用MouseHoL函数,判断鼠标是否离开cbtn窗口
break ;
case WM_COMMAND :
break ;
default:
return DefWindowProc(hWnd, message, wParam, lParam); ;
}
return 0;
}

//定义鼠标停留或离开函数
wchar_t* MouseHoL(HWND hWnd) {
RECT cRC, winRC; //控件屏幕位置RECT,控件窗口大小RECT
POINT Mxy,Cxy; //鼠标坐标结构,控件坐标结构
GetCursorPos(&Mxy); //获取鼠标在屏幕的坐标
GetWindowRect(hWnd, &cRC);
//获取控件位于屏幕的位置及大小
GetClientRect(hWnd, &winRC); //获取控件的宽高
cRC.right = cRC.left + winRC.right; //控件右下角的x坐标,也就是宽
cRC.bottom = cRC.top + winRC.bottom; //控件右下角的y坐标,也就是高
if (Mxy.x > cRC.left && Mxy.x < cRC.right && Mxy.y > cRC.top && Mxy.y < cRC.bottom) { //判断鼠标坐标是否在窗口内
return L"鼠标已进入控件";
}else {
return L"鼠标经离开控件";
}
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-06-16
函数功能:当在指定时间内鼠标指针离开或盘旋在一个窗口上时,此函数寄送消息。

函数原型:BOOL TrackMouseEvent(LPTRACKMOUSEEVENT lpEventTrack);

参数:

lpEventTrack;指向结构TRACKMOUSEEVENT的指针。

返回值:如果函数调用成功,返回非零值;如果函数调用失败,返回值是零。若想获得更多的错误信息,请调用GetLastError函数。

此函数能寄送如下消息:

WM_MOUSEHOVER:在上次调用TrackMouseEvent指定的时间里,鼠标盘旋在窗口的客户区。当此消息产生时,盘旋跟踪停止。如果需要进一步的鼠标盘旋跟踪,应用程序应当再次调用TrackMouseEvent。

WM_MOUSELEAVE:鼠标离开上次调用TrackMouseEvent时指定的窗口客户区。当此消息产生时,所有由TrackMouseEvent要求的跟踪都被取消。当鼠标再次进入窗口,并且要求进一步的鼠标盘旋跟踪时,应用程序必须调用TrackMouseEvent。

备注:当鼠标指针在指定时间内停留在指定矩形内,就被认为是处于盘旋状态。调用函数

SystemParameterslnfo并使用SPI_GETMOUSEAOVERWIDTH,SPI_GETMOUSEHOVERAEIGHT和

SFI_GETMOOSEAOVERTIME值来取得矩形的大小和时间。

速查:Windows NT 4.0及以上版本;Windows 98及以上版本;Windows CE:1.0及以上版本;头文件:winuser.h;输入库:user32.lib。
第2个回答  2013-06-16
哈哈,都不给我发个链接,还好被我发现了。给你个代码片段:TRACKMOUSEEVENT tme = {0};
switch(uMsg)
{
case WM_MOUSEMOVE:
tme.cbSize = sizeof(tme);
tme.dwFlags = TME_HOVER | TME_LEAVE;
tme.hwndTrack = hwnd;
tme.dwHoverTime = 50; //鼠标在窗口上停留50毫秒时发送WM_MOUSEHOVER,可以改
TrackMouseEvent(&tme);
break;
case WM_MOUSELEAVE:
SetWindowText(hwnd,_T("MouseLeave"));
break;
case WM_MOUSEHOVER:
SetWindowText(hwnd,_T("MouseHover"));
break;本回答被网友采纳
第3个回答  2013-06-16
可以用WM_MOUSEMOVE消息处理,因为OnMouseMove可以返回一个鼠标坐标,在判断IsPtInRect就可以了!
第4个回答  2013-06-16
WindowFromPoint 可以得到当前PT所在的窗口句柄.判断句柄就知道是不是在你的窗口中..

C++ 如何判断鼠标有没有在窗口上? 纯API 不是MFC
SetWindowText (edt, MouseHoL(cbtn)); \/\/调用MouseHoL函数,判断鼠标是否停留在cbtn窗口 break ;case WM_MOUSELEAVE : \/\/鼠标离开消息(这不会自动触发,需要TrackMouseEvent函数来触发)SetWindowText (edt, MouseHoL(cbtn)); \/\/调用MouseHoL函数,判断鼠标是否离开cbtn窗口 break ;case WM_COMM...

C++怎么判断鼠标在图片上的位置(是WIN32的API程序,不是MFC哦)
ScreenToClient把相对 屏幕的坐标转成相对窗体客户区的坐标 然后就可以判断了...

C++编程能不能在黑窗口里面进行鼠标操作,不用MFC,运行结果在一个黑...
这个不可能的吧。界面分为图形界面个字符界面两种,控制台程序都是属于字符界面,键盘可以操作,但是鼠标不行。图形界面的话两种操作都可以。

C++怎样得到另一个窗口的位置坐标等信息,是通过HOOK来实现吗?怎样实现...
但是要HOOK其他进程的窗口的话,你需要放CALLBACK放在DLL里.简洁但是麻烦.Non-Hook也就是上面两句代码简单但不是很有效率.最后说句,以后你可以把这种问题发布到MFC领域,那里会得到更多答案.因为这个不是C++.而是win32编程,

是C和C++重要,还是API和MFC重要呢?
没有哪个重要之说吧。通俗地说,MFC是把API封装了一遍,尽管如此你还是免不了要直接调用API,此外MFC的接口和API非常接近,如果你对API较为熟悉的话,很容易上手。如果不学API的话,你可能就不懂MFC的原理。

学了C++语法后要不要学MFC
MFC == Microsoft Foundation Class Library 如果你不用它,那你就要自己开发很多基本的东西啦。例如,文件选择器,你要画框,要从根目录开始找文件名,文件夹名,揿文件夹名深一层,用鼠标选文件名,文件名多时,用鼠标拉滑块。。。例如,颜色选择器,你要画框,画色块,用鼠标选颜色。。。例如,画...

MFC是什么
Visual C++ 中的资源编辑器可以使你能容易的建立和定制这些界面对象。事件驱动软件和词汇 所有基于窗口的GUI 都包含相同的基本元素,它们的操作方式都是相同的。在屏幕上,用户所看到的是一组窗口,每个窗口都包含有控件、图标、对象以及一些处理鼠标和键盘的元素。从用户角度来看,各系统的界面对象都是相同的:按钮、滚动...

如何在Visual C++上添加控件?
1.不要建立win32 Console Application ,需要的是win32 Application (如果你是sdk(直接使用api)编程而不是mfc编程的话)2.ResourceView要显示出来,只需要在file -》new-》Resource Script 新建一个Resource Script然后vc6自动会出现那个的。(如果没有,那就新添加对话框)3.在文件夹右击,添加...

120分!120分!! C++ 有项目经验的进!!!
举个例子来说,比如你在窗口中绘制了一条直线,并有一个按钮,当点机按钮时把直线修改为圆形,也就是说点击按鼠时产生一个鼠标事件,在这个事件的作用是把直线改为圆形,那么你在事件中把直线修改为圆形,这个过程只在程序知道你做了这种更改,而窗口并不知道有这个更改,因此你就需要在事件中使用更新...

MFC是什么意思?
MFC是Win API与C++的结合,API,即微软提供的WinDOS下应用程序的编程语言接口,是一种软件编程的规范,但不是一种程序开发语言本身,可以允许用户使用各种各样的第三方(如我是一方,微软是一方,Borland就是第三方)的编程语言来进行对WinDOS下应用程序的开发,使这些被开发出来的应用程序能在WinDOS下运行,比如VB,VC++,J...

相似回答