设置TrackMouseEvent捕获WM_MOUSEHOVER和WM_MOUSELEAVE消息
WM_MOUSEHOVER(非客户区消息为WM_NCMOUSEHOVER)消息表示鼠标在客户区悬浮消息,WM_MOUSELEAVE(非客户区消息为WM_NCMOUSELEAVE)为鼠标离开客户区消息,这四个消息都需要提前调用TrackMouseEvent函数设置捕获。
Windows API函数定义为:
BOOL WINAPI TrackMouseEvent(
_Inout_ LPTRACKMOUSEEVENT lpEventTrack
);
在设置TrackMouseEvent函数前需要定义TRACKMOUSEEVENT结构体,参数含义为:
cbSize: sizeof(TRACKMOUSEEVENT)
dwFlags: TME_CANCEL(取消捕获,需配合TME_HOVER或TME_LEAVE或TME_NONCLIENT使用)、TME_HOVER(捕获WM_MOUSEHOVER)、TME_LEAVE(捕获WM_MOUSELEAVE)、TME_NONCLIENT(捕获WM_NCMOUSEHOVER和WM_NCMOUSELEAVE)、TME_QUERY
hwndTrack: 窗口句柄
dwHoverTime: 如果是WM_MOUSEHOVER消息,设置触发该消息的时间,或者使用系统默认HOVER_DEFAULT,单位ms
typedef struct tagTRACKMOUSEEVENT { DWORD cbSize; DWORD dwFlags; HWND hwndTrack; DWORD dwHoverTime; } TRACKMOUSEEVENT, *LPTRACKMOUSEEVENT;
TrackMouseEvent函数在设置后,如果成功捕获消息后,设置会立马失效,如果下次还需要捕获消息,需重新调用TrackMouseEvent设置。
下例为通过一个布尔变量bTrackFlag 避免频繁的调用TrackMouseEvent设置,在捕获消息后重置bTrackFlag 变量,以便下次能重新捕获消息。
1 //窗口消息处理过程 2 LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam,LPARAM lParam) 3 { 4 //... 5 switch (message) 6 { 7 case WM_MOUSEMOVE: 8 { 9 if(!bTrackFlag ){ 10 TRACKMOUSEEVENT tme; 11 tme.cbSize = sizeof(TRACKMOUSEEVENT); 12 tme.dwFlags = TME_LEAVE|TME_HOVER; 13 tme.hwndTrack = m_hwnd; //窗口句柄 14 tme.dwHoverTime = 100; 15 ::TrackMouseEvent(&tme); 16 bTrackFlag = TRUE; 17 } 18 } 19 break; 20 case WM_MOUSELEAVE: 21 { 22 bTrackFlag = FALSE; 23 //... 24 } 25 break; 26 case WM_MOUSEHOVER: 27 { 28 bTrackFlag = FALSE; 29 //... 30 } 31 //... 32 } 33 }
参考资料:
a): TrackMouseEvent function: https://msdn.microsoft.com/zh-tw/library/windows/desktop/ms646265(v=vs.85).aspx
b): TRACKMOUSEEVENT structure: https://msdn.microsoft.com/zh-tw/library/windows/desktop/ms645604(v=vs.85).aspx
posted on 2017-07-13 16:00 SpartacusIn21 阅读(1620) 评论(0) 编辑 收藏 举报