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

  • 相关阅读:
    洛谷 P4114 Qtree1
    洛谷 P2486 [SDOI2011]染色
    洛谷 P1505 [国家集训队]旅游
    洛谷 P4281 [AHOI2008]紧急集合 / 聚会
    C++中main函数的返回值一定要是int
    局部变量作为函数返回值
    sizeof和strlen在string类中的使用
    strlen 和 sizeof 的区别
    数据结构中的堆栈和内存中的堆栈问题
    数据类型的字长,字节问题
  • 原文地址:https://www.cnblogs.com/chenyangchun/p/7159687.html
Copyright © 2020-2023  润新知