当WM_MOUSELEAVE有时不起作用时,如何知道鼠标何时离开我的窗口?

时间:2011-05-12 18:09:35

标签: c++ winapi mouseevent

我遇到TrackMouseEventWM_MOUSELEAVE的问题。当鼠标悬停在TrackMouseEventWM_SETCURSOR处理程序的窗口上时,我会在我的应用中调用WM_NCHITTEST。问题是,如果我将鼠标快速移出窗口,我根本不会得到WM_MOUSELEAVE

我很确定我正确使用它,因为正常,较慢的动作会产生WM_MOUSELEAVE。只有当鼠标移动得太快而无法生成时。问题是,我该怎么发现这个?我的应用并不总是在前台,所以我不确定SetCapture会做我需要的。

3 个答案:

答案 0 :(得分:1)

可能是你需要WM_NCMOUSELEAVE。

编辑:我认为值得一提的是,文档暗示您必须调用TrackMouseEvent。但是,我从来没有这样做过,我仍然收到了MOUSELEAVE消息。也许这个电话现在是多余的和/或错误的?

答案 1 :(得分:1)

我的经验是TrackMouseEvent不可靠。当我需要可靠的鼠标叶时,我已经使用了计时器。 (对于从MFC项目中删除此事表示歉意)

void OnNotifyMouseLeave()
{
    // Mouse is gone
}

void OnMouseMove(UINT nFlags, CPoint point) 
{
    if ( m_uTimerId == 0 )
        m_uTimerId = SetTimer( MOUSELEAVE, 250, NULL );

    ...
}

void OnTimer( UINT_PTR nIDEvent ) 
{
    if ( nIDEvent == MOUSELEAVE )
    {
        POINT pt;
        RECT rect;
        GetCursorPos( &pt );
        GetWindowRect( &rect );
        if ( !PtInRect( &rect, pt ) )
        {   OnNotifyMouseLeave();
            if ( m_uTimerId != 0 )
            {   KillTimer( m_uTimerId );
                m_uTimerId = 0;
            }
        }
    }

    ...
}

答案 2 :(得分:0)

MouseLeave很挑剔。 SetCapture是您需要使用的。此外,如果您的应用无法清晰对焦,我认为您无法可靠地获取鼠标消息。