用_TrackMouseEvent可以检测到鼠标离开或进入窗口(WM_MOUSELEAVE,WM_MOUSEHOVER)

解决方案 »

  1.   

    lbxx:_TrackMouseEvent 怎么用啊?好象得调用两次,它寄送的消息发到哪个窗口了?
     其中有个参数是TRACKMOUSEEVENT结构,具体应怎么设置。
      

  2.   

    我的名字不是lbxx而是lhxx!
    发送到本窗口,需要手动加入,先在头文件的适当位置加入:
    afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);
    afx_msg LRESULT OnMouseHover(WPARAM wParam, LPARAM lParam);
    然后在.cpp文件的适当位置加入:
    ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)
    ON_MESSAGE(WM_MOUSEHOVER,OnMouseHover)以及相应的响应函数:LRESULT CLhxCtrl::OnMouseLeave(WPARAM wParam, LPARAM lParam)
    {
         //你的代码
    return TRUE;
    }LRESULT CLhxCtrl::OnMouseHover(WPARAM wParam, LPARAM lParam)
    {
        //你的代码
    return TRUE;
    }最后在OnMouseMove响应函数中加入:
    TRACKMOUSEEVENT tmeIn ;
    tmeIn.cbSize = sizeof(TRACKMOUSEEVENT);
    tmeIn.dwFlags = TME_HOVER|TME_LEAVE;
    tmeIn.hwndTrack = this->m_hWnd;
    tmeIn.dwHoverTime = 1 ;        //注意:这个参数一定要设置!
    ::_TrackMouseEvent(&tmeIn);

      

  3.   

    lhxx:我眼神不好,多包含,不过我改叫你雷锋吧。
    你的程序我试了一下,OK!
    在此之前看了一钟头API,好象那意思要至少调用两次TrackMouseEvent才行
    第二次调用检查到"鼠标离开上次调用TrackMouseEvent时指定的窗口客户区”(书上原文)就寄送“WM_MOUSELEAVE”消息。真是误导,我还乱试OnTimer什么的,那个TRACKMOUSEEVENT结构更无从查起,一按F1,MSDN就报非法操作...
    总之多谢多谢,没有你的指引,还不知要在黑暗中摸索多少年...不过tmeIn.cbSize = sizeof(TRACKMOUSEEVENT);也绝不能少,如果不加就出不来,API中有许多不知在哪里能查到的结构,和这种看似无用的成员,你有什么经验么?