C++ 当WM#U MOUSELEAVE有时不显示时,如何知道鼠标何时离开我的窗口';不行?

C++ 当WM#U MOUSELEAVE有时不显示时,如何知道鼠标何时离开我的窗口';不行?,c++,winapi,mouseevent,C++,Winapi,Mouseevent,我对TrackMouseEvent和WM\u MOUSELEAVE有问题。当鼠标位于WM_SETCURSOR和WM_nchitest处理程序中的我的窗口上方时,我在我的应用程序中调用TrackMouseEvent。问题是,如果我将鼠标快速移出我的窗口,我根本不会得到WM_MOUSELEAVE 我相当肯定我使用的是正确的,因为正常、缓慢的移动将产生WM\u MOUSELEAVE。只有当鼠标移动太快时,才会生成鼠标。问题是,我该如何检测这个?我的应用程序并不总是在前台,所以我不确定SetCaptur

我对
TrackMouseEvent
WM\u MOUSELEAVE
有问题。当鼠标位于
WM_SETCURSOR
WM_nchitest
处理程序中的我的窗口上方时,我在我的应用程序中调用
TrackMouseEvent
。问题是,如果我将鼠标快速移出我的窗口,我根本不会得到
WM_MOUSELEAVE


我相当肯定我使用的是正确的,因为正常、缓慢的移动将产生
WM\u MOUSELEAVE
。只有当鼠标移动太快时,才会生成鼠标。问题是,我该如何检测这个?我的应用程序并不总是在前台,所以我不确定
SetCapture
是否能满足我的需要。

MouseLeave很挑剔。SetCapture是您需要使用的。此外,如果你的应用程序没有聚焦,我认为你无法可靠地获取鼠标消息。

可能是WM\u NCMOUSELEAVE是你所需要的


编辑:在我看来,值得一提的是,这些文档暗示您必须调用TrackMouseeEvent。然而,我从来没有这样做过,我仍然得到了鼠标移动的信息。也许这个呼叫现在是多余的和/或有问题的?

我的经验是TrackMouseeEvent不可靠。当我需要可靠的鼠标叶子时,我用定时器代替。(对从MFC项目中删除此内容表示歉意)


谢谢我希望避免使用SetCapture,因为TrackMouseEvent听起来像是可以做我想做的事情,而且工作量更少。我想我会切换到SetCapture,看看效果是否更好。我喜欢这样。这很好,但它让你的计时器一直在响。不过更可靠。想知道如果使用OnMouseMove杀死现有计时器并启动一个新的计时器是否会减少开销,这样当你知道用户正在穿越场地时,就不会有无目的的计时器启动。好吧,如果用户将鼠标移出窗口,计时器就会被杀死。当鼠标在窗口中时,每秒只有四次呼叫。这应该是相当低的开销。
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;
            }
        }
    }

    ...
}