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;
}
}
}
...
}