Другой способ — создать 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]
делает то, что вы хотите, я бы точно согласился. Это более высокий уровень и, следовательно, меньше кода.
person
Thomas Zoechling
schedule
19.12.2010