Innym sposobem byłoby stworzenie CGEventTap który przechwytuje myszy wydarzenia.
Następnie wystarczy pamiętać o ostatnim typie zdarzenia i sprawdzić, czy w jednej z metod delegowania NSMenu.
Oto przykładowy kod:
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 docs stwierdzają, że:
zawory imprez otrzymać w góre i klucz dół wydarzeń, jeśli jeden z następujących warunków jest spełniony:
- Bieżący proces działa jako użytkownik root .
- Dostęp do urządzeń pomocniczych jest włączony. W systemie Mac OS X 10.4, można włączyć tę funkcję, korzystając z opcji Preferencje systemowe, Uniwersalny dostęp , Widok uniwersalny , Widok klawiatury.
dwukrotnym sprawdzeniu, i wydaje się, że naprawdę nie trzeba włączyć urządzeń wspomagających do odbierania zdarzeń myszy.
Ale jeśli [[[NSApplication sharedApplication] currentEvent] buttonNumber]
robi to, co chcesz, zdecydowanie bym z tym. Jest to wyższy poziom, a zatem mniej kodu.
to jest najlepszy sposób to zrobić, ale można po prostu użyć [[NSApp currentEvent] buttonNumber].NSApp to globalna zmienna wskazująca obiekt aplikacji. – ughoavgfhw
Dustin Senos: Powinieneś opublikować to jako odpowiedź na własne pytanie. Załatwię to. –