设置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

原文地址:https://www.cnblogs.com/chenyangchun/p/7159687.html