我和TrackMouseEvent和WM_MOUSELEAVE有点问题。在WM_SETCURSOR和WM_NCHITTEST处理程序中,当鼠标悬停在我的窗口上时,我会在应用程序中调用TrackMouseEvent。问题是,如果我非常快地将鼠标移出我的窗口,我根本得不到WM_MOUSELEAVE。
我相当确定我使用的是正确的,因为正常的,较慢的运动会产生WM_MOUSELEAVE。只有当鼠标移动得太快时,它才不会被生成。问题是,我该如何检测它呢?我的应用程序并不总是在前台,所以我不确定SetCapture是否能满足我的需求。
发布于 2011-05-13 03:14:08
可能WM_NCMOUSELEAVE正是您所需要的。
编辑:在我看来,值得一提的是,文档暗示您必须调用TrackMouseEvent。然而,我从来没有这样做过,我仍然收到了MOUSELEAVE消息。也许这个调用现在是多余的和/或错误的?
发布于 2011-05-13 03:41:05
我的经验是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;
}
}
}
...
}发布于 2011-05-13 03:06:42
MouseLeave很挑剔。SetCapture是您需要使用的。此外,我认为如果你的应用程序不在焦点上,你就不能可靠地收到鼠标消息。
https://stackoverflow.com/questions/5982399
复制相似问题