NSMenu нажал кнопку мыши в 10,5 - PullRequest
5 голосов
/ 19 декабря 2010

Я обновляю (downdating?) Приложение, которое я написал для 10.6+, чтобы работать в 10.5+.Я борюсь с захватом нажатой в данный момент кнопки мыши в селекторе -(void)menuWillOpen:(NSMenu *);.

Для 10.6+ я пользуюсь [NSEvent pressedMouseButtons], который позволяет мне нажиматькнопка за пределами потока событий.Тем не менее, это не существует в 10.5+ (кажется, мне нужно позвонить [theEvent buttonNumber].

Как мне захватить нажатую кнопку мыши (вправо или влево):

  1. Внутри моего представителя NSMenu
  2. Желательно, внутри селектора -(void)menuWillOpen:(NSMenu *)menu
  3. В поместье, которое работает как в 10,5+, так и в 10,6 +

Я очень ценю помощьи знайте, что StackOverflow поможет новому программисту Objective-C!

Спасибо, Дастин

Ответы [ 2 ]

6 голосов
/ 19 декабря 2010

В итоге я смог получить текущую кнопку мыши, позвонив (спасибо Нику Полсону за помощь):

[[[NSApplication sharedApplication] currentEvent] buttonNumber]

As ughoavgfhw указал, что более короткий способ получения того же события:

[[NSApp currentEvent] buttonNumber]

2 голосов
/ 19 декабря 2010

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

...