Как узнать, когда мышь покидает мое окно, когда WM_MOUSELEAVE иногда не работает? - PullRequest
3 голосов
/ 12 мая 2011

У меня проблема с TrackMouseEvent и WM_MOUSELEAVE. Я вызываю TrackMouseEvent в моем приложении, когда мышь находится над моим окном в обработчиках WM_SETCURSOR и WM_NCHITTEST. Проблема в том, что если я очень быстро вывожу мышь из окна, я не получу WM_MOUSELEAVE.

Я вполне уверен, что использую это правильно, потому что нормальные, более медленные движения будут производить WM_MOUSELEAVE. Только когда мышь движется слишком быстро, она не генерируется. Проблема в том, как я должен это обнаружить? Мое приложение не всегда на переднем плане, поэтому я не уверен, что SetCapture сделает то, что мне нужно.

Ответы [ 3 ]

1 голос
/ 12 мая 2011

Может быть, WM_NCMOUSELEAVE - это то, что вам нужно.

Редактировать: На мой взгляд, стоит упомянуть, что документы подразумевают, что вы должны вызывать TrackMouseEvent.Тем не менее, я никогда не делал этого, и я все еще получил сообщение MOUSELEAVE.Возможно, этот вызов теперь избыточен и / или глючит?

1 голос
/ 12 мая 2011

Мой опыт показывает, что TrackMouseEvent ненадежен. Когда мне нужны были надежные листья мыши, я использовал таймеры. (извиняюсь за то, что вырезал это из проекта МФЦ)

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

    ...
}
0 голосов
/ 12 мая 2011

MouseLeave привередлив.SetCapture - это то, что вам нужно использовать.Кроме того, я не думаю, что вы можете получать сообщения мыши надежно, если ваше приложение не в фокусе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...