Странное поведение CGEventPost при щелчке мышью - PullRequest
2 голосов
/ 23 марта 2011

В моем приложении Mac я пытаюсь перехватить события правой / нижней мыши с помощью CG Event Taps.У меня есть код, который регистрируется как слушатель, работающий просто отлично.То, что я пытаюсь сделать, это перехватить, когда пользователь нажимает правую кнопку мыши, и временно съесть событие.Когда они отпускают правую кнопку мыши, я хочу опубликовать событие нажатия правой кнопки мыши, если они не двигали мышь с момента исходного события нажатия мыши.Если они двигали мышь, я хочу, чтобы код моего приложения делал что-то другое.Все это прекрасно работает, если я запускаю код на своем Macbook с помощью трекпада.Однако, когда я подключаю мышь к тому же компьютеру, любое другое событие отключения мыши не вызывает моего обратного вызова.

Основная логика для этого заключается в том, что я отслеживаю бул "игнорировать следующее событие".Когда моя программа запускается в первый раз, устанавливается значение false.Когда я получаю событие нажатия правой кнопки мыши, я возвращаю NULL.Когда срабатывает событие правой кнопки мыши, я создаю и публикую новое событие правой кнопки мыши с ignoreNext в true.Затем я возвращаю правое событие мыши.

Вот мой код:

CGPoint mouseDownPoint;
bool ignoreNext;

//---------------------------------------------------------------------------
CGEventRef MouseTapCallback( CGEventTapProxy aProxy, CGEventType aType, CGEventRef aEvent, void* aRefcon ) 
//---------------------------------------------------------------------------
{
    if( aType == kCGEventRightMouseDown ) NSLog( @"down" );
    else if( aType == kCGEventRightMouseUp ) NSLog( @"up" );
    else NSLog( @"other" );

    NSLog( @"ignored: %d", ignoreNext );

    CGPoint theLocation = CGEventGetLocation(aEvent);

    if( !ignoreNext )
    {
        if( aType == kCGEventRightMouseDown )
        {
            mouseDownPoint = theLocation;

            return NULL;
        }
        else if( aType == kCGEventRightMouseUp )
        {
            if( abs( theLocation.x - mouseDownPoint.x ) < 1 &&
                abs( theLocation.y - mouseDownPoint.y ) < 1 )
            {
                ignoreNext = true;

                CGEventRef theNewEvent = CGEventCreateMouseEvent( NULL,
                                                                 kCGEventRightMouseDown, 
                                                                 mouseDownPoint, 
                                                                 kCGMouseButtonRight );

                CGEventSetType( theNewEvent, kCGEventRightMouseDown );
                CGEventPost( kCGHIDEventTap, theNewEvent );

                return aEvent;
            }
            else
            {
                // execute my app's code here...

                return NULL;
            }
        }
    }

    ignoreNext = false;
    return aEvent; 
}

Вывод для этого, когда я тестирую его с помощью трекпада (работает правильно):

вниз игнорируется: 0 вверх игнорируется: 0 down игнорируется: 1

Вывод для этого, когда я тестирую его с помощью реальной мыши (примечание: событие нажатия мыши отсутствует во время второго прогона):

Первый раз, нажав вниззатем вверх ...

вниз игнорируется: 0 вверх игнорируется: 0 вниз игнорируется: 1

Во второй раз событие нажатия мыши не вызывает мой обратный вызов ...

up игнорируется: 0

Кто-нибудь видел что-то подобное раньше, и если да, что вы делали, чтобы решить эту проблему?Спасибо за ваше время.

...