Другим способом было бы создать CGEventTap, который захватывает события нажатия мыши.
Затем вам просто нужно запомнить последний тип события и проверить его в одном из ваших методов делегата NSMenu.
Вот пример кода:
CGEventRef MouseClickedEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void* refcon)
{
CGPoint location = CGEventGetLocation(event);
switch (type)
{
case kCGEventLeftMouseDown:
{
NSLog(@"Left Mouse pressed at %@", NSStringFromPoint(NSPointFromCGPoint(location)));
break;
}
case kCGEventRightMouseDown:
{
NSLog(@"Right Mouse pressed at %@", NSStringFromPoint(NSPointFromCGPoint(location)));
break;
}
case kCGEventOtherMouseDown:
{
NSLog(@"Other Mouse pressed at %@", NSStringFromPoint(NSPointFromCGPoint(location)));
break;
}
default:
break;
}
return event;
}
- (void)applicationDidFinishLaunching:(NSNotification*)aNotification
{
CGEventMask eventMask = CGEventMaskBit(kCGEventLeftMouseDown)|CGEventMaskBit(kCGEventRightMouseDown)|CGEventMaskBit(kCGEventOtherMouseDown);
CFMachPortRef eventTap = CGEventTapCreate(kCGSessionEventTap, kCGHeadInsertEventTap, 0, eventMask, MouseClickedEventCallback, NULL);
CFRunLoopSourceRef runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0);
CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopCommonModes);
CGEventTapEnable(eventTap, true);
}
Документы Quartz Event Services утверждают, что:
Сигналы событий получают ключ вверх и ключ вниз
события, если одно из следующих
условия верны:
- Текущий процесс выполняется как
пользователь root.
- Доступ для ассистивных
устройства включены. В Mac OS X v10.4,
Вы можете включить эту функцию, используя
Системные настройки, Универсальный доступ
панель, вид клавиатуры.
Я дважды проверил это, и кажется, что вам действительно не нужно включать вспомогательные устройства для получения событий мыши.
Но если [[[NSApplication sharedApplication] currentEvent] buttonNumber]
сделает то, что вы хотите, я бы с этим согласился. Это более высокий уровень и, следовательно, меньше кода.