В моем приложении 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
Кто-нибудь видел что-то подобное раньше, и если да, что вы делали, чтобы решить эту проблему?Спасибо за ваше время.