我遇到TrackMouseEvent
和WM_MOUSELEAVE
的问题。当鼠标悬停在TrackMouseEvent
和WM_SETCURSOR
处理程序的窗口上时,我会在我的应用中调用WM_NCHITTEST
。问题是,如果我将鼠标快速移出窗口,我根本不会得到WM_MOUSELEAVE
。
我很确定我正确使用它,因为正常,较慢的动作会产生WM_MOUSELEAVE
。只有当鼠标移动得太快而无法生成时。问题是,我该怎么发现这个?我的应用并不总是在前台,所以我不确定SetCapture
会做我需要的。
答案 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是您需要使用的。此外,如果您的应用无法清晰对焦,我认为您无法可靠地获取鼠标消息。