首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当WM_MOUSELEAVE有时无法工作时,如何知道鼠标何时离开我的窗口?

当WM_MOUSELEAVE有时无法工作时,如何知道鼠标何时离开我的窗口?
EN

Stack Overflow用户
提问于 2011-05-13 02:09:35
回答 3查看 3.4K关注 0票数 3

我和TrackMouseEventWM_MOUSELEAVE有点问题。在WM_SETCURSORWM_NCHITTEST处理程序中,当鼠标悬停在我的窗口上时,我会在应用程序中调用TrackMouseEvent。问题是,如果我非常快地将鼠标移出我的窗口,我根本得不到WM_MOUSELEAVE

我相当确定我使用的是正确的,因为正常的,较慢的运动会产生WM_MOUSELEAVE。只有当鼠标移动得太快时,它才不会被生成。问题是,我该如何检测它呢?我的应用程序并不总是在前台,所以我不确定SetCapture是否能满足我的需求。

EN

回答 3

Stack Overflow用户

发布于 2011-05-13 03:14:08

可能WM_NCMOUSELEAVE正是您所需要的。

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

票数 1
EN

Stack Overflow用户

发布于 2011-05-13 03:41:05

我的经验是TrackMouseEvent是不可靠的。当我需要可靠的鼠标叶时,我用定时器代替。(很抱歉将其从MFC项目中删除)

代码语言:javascript
复制
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;
            }
        }
    }

    ...
}
票数 1
EN

Stack Overflow用户

发布于 2011-05-13 03:06:42

MouseLeave很挑剔。SetCapture是您需要使用的。此外,我认为如果你的应用程序不在焦点上,你就不能可靠地收到鼠标消息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5982399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档