TrackMouseEvent函数在鼠标离开某一窗口或在某一窗口上停留超过某一特定时间长度时发送消息。
原型:BOOL TrackMouseEvent(LPTRACKMOUSEEVENT lpEventTrack);
参数:
lpEventTrack:是一个指向TRACKMOUSEEVENT结构体的指针。
返回: 成功的话返回非零值(true),否则返回零(false)。
该函数可以发送的消息包括:(WM_MOUSEHOVER,WM_MOUSELEAVE)
WM_MOUSEHOVER:
鼠标在窗口的某一客户区上停留上一次调用TrackMouseEvent函数时所设定的时间长度时发送。在该消息产生之后将停止跟踪,如果需要进一步跟踪鼠标的停留事件,必须再次调用TrackMouseEvent函数。
WM_MOUSELEAVE:
当鼠标离开前一次调用TrackMouseEvent函数所设定的窗口的客户区时发送该消息。在产生该消息时,所有由TrackMouseEvent请求的跟踪都将被取消。如果需要对鼠标的hover事件进行进一步的跟踪,必须在鼠标重新进入窗口里再次调用TrackMouseEvent函数。
TRACKMOUSEEVENT结构体:
其定义如下:
typedef struct tagTRACKMOUSEEVENT
{
DWORD cbSize;
DWORD dwFlags;
HWND hwndTrack;
DWORD dwHoverTime;
} TRACKMOUSEEVENT, *LPTRACKMOUSEEVENT;
几个成员的含义:
cbSize: 定义TRACKMOUSEEVENT结构体的大小;
dwFlags:定义服务请求,可以是下列值的组合:
TME_CANCEL: 取消前一次的跟踪请求;使用该项时必须指定要取消跟踪的类型,例如要取消hover跟踪,就必须同时传送TME_CANCEL和TME_HOVER(TME_CANCEL|TME_HOVER)。
TME_HOVER : hover通知。可以发送WM_MOUSEHOVER消息。如果在hover跟踪处于激活状态时再次请求hover跟踪的话,hover的定时器将被重置。
TME_LEAVE : 鼠标离开。发送TME_MOUSELEAVE消息。当鼠标不在指定的窗口或区域上时,将立即产生一个leave通知,不再做任何跟踪。
TME_QUERY : 这一项不是作为跟踪请求的。选中这一项时,当结构体被传送给TrackMouseEvent函数时,即产生当前跟踪。唯一不同的是返回的消耗时间,是真实的消耗时间而不是HOVER_DEFAULT,即使之前TrackMouseEvent函数所请求的是HOVER_DEFAULT。
hwndTrack: 待跟踪窗口的句柄
dwHoverTime: 定义hover事件的耗尽时间(如果在dwFlags中有定义TME_HOVER的话),单位毫秒。
可以使用HOVER_DEFAULT来使用系统默认的hover事件耗尽时间。
系统默认的hover事件耗尽时间为菜单下拉时间,即400毫秒。可以调用SystemParameterInfo函数并使用SPI_GETMOUSEHOVERTIME来获取默认的hover耗尽时间。
默认的hover矩形区与双击区一致。可以调用SystemParameterInfo并使用SPI_GETMOUSEHOVERWIDTH和SPI_GETMOUSEHOVERHEIGHT来获取鼠标在上面停留可以产生WM_MOUSEHOVER的区域。
问题:
有一个小问题。前面一直都说的是TrackMouseEvent函数,但实在上,在程序中,如果直接使用TrackMouseEvent(&tme);时,会出现诸如“'TrackMouseEvent' : undeclared identifier”的错误。但如果你使用_TrackMouseEvent(&tme);就不会有错误了。为什么呢?
1.在stdafx.h 最开头加一句 #define _WIN32_WINNT 0x0500
2.使用这个_TrackMouseEvent这个函数名称
分析:
这两个函数的区别,TrackMouseEvent函数的头文件是winuser.h,对应的库文件为user32.lib,而_TrackMouseEvent函数则在commctrl.h里定义,而由COMCTRL32.DLL导出。
使用TrackMouseEvent函数必须用extern "C"导入此函数。
如下:extern "C" WINUSERAPI BOOL WINAPI TrackMouseEvent (LPTRACKMOUSEEVENT lpEventTrack);
NOTE:由上面说到的TrackMouseEvent函数的特点,通常都在OnMouseMove函数里添加该函数。另外,可以与SetCapture函数联合使用,即使在鼠标移出窗口区时也能够响应。