Как реализовать ввод с помощью сочетания клавиш в Mac Cocoa App? - PullRequest
8 голосов
/ 20 ноября 2011

Мне нужно было создать глобальную горячую клавишу для ввода в моем приложении Какао.

Я знаю о Shortcut Recorder, но это очень старое решение. В нем реализованы детали с использованием Carbon, который устарел, и я не могу опубликовать свое приложение в Mac App Store, если я его использую.

Есть ли готовое современное решение? Кто-нибудь может дать мне способ сделать это самому (я не знаю, с чего начать)?

Ответы [ 3 ]

14 голосов
/ 12 августа 2012

Существует современная структура с именем MASShortcut для реализации глобальных ярлыков в OS X 10.7 +.

13 голосов
/ 21 ноября 2011

Не весь углерод считается устаревшим. Вы не можете больше создавать приложения из чистого углерода, но некоторые API работают, и некоторые из них по-прежнему являются самым простым способом сделать определенные вещи.

Одним из них является API горячих клавиш Carbon Events. Вы, конечно, можете просеивать все события, используя методы мониторинга событий NSEvent, но это ненужная работа. API горячих клавиш Carbon Events по-прежнему поддерживается и намного проще - вы просто сообщаете ему, какой клавише вы хотите соответствовать и какую функцию вызывать при нажатии клавиши. И есть обертки Какао, такие как DDHotKey, которые делают его еще проще.

13 голосов
/ 20 ноября 2011

В Mac OS X 10.6 и выше вы можете использовать методы + addGlobalMonitorForEventsMatchingMask: handler: и + addLocalMonitorForEventsMatchingMask: handler: , определенный из класса NSEvent. Мониторинг событий сообщает следующую информацию:

Локальные и глобальные мониторы событий являются взаимоисключающими. Например, глобальный монитор не отслеживает поток событий приложения, в котором он установлен. Локальный монитор событий наблюдает только за потоком событий своего приложения. Чтобы отслеживать события из всех приложений, включая «текущее», необходимо установить оба монитора событий.

Код, показанный на этой странице, предназначен для локального монитора событий, но код для глобального монитора событий аналогичен; какие изменения вызывает метод NSEvent.

_eventMonitor = [NSEvent addLocalMonitorForEventsMatchingMask:
        (NSLeftMouseDownMask | NSRightMouseDownMask | NSOtherMouseDownMask | NSKeyDownMask)
        handler:^(NSEvent *incomingEvent) {
    NSEvent *result = incomingEvent;
    NSWindow *targetWindowForEvent = [incomingEvent window];
    if (targetWindowForEvent != _window) {
        [self _closeAndSendAction:NO];
    } else if ([incomingEvent type] == NSKeyDown) {
        if ([incomingEvent keyCode] == 53) {
            // Escape
            [self _closeAndSendAction:NO];
            result = nil; // Don't process the event
        } else if ([incomingEvent keyCode] == 36) {
            // Enter
            [self _closeAndSendAction:YES];
            result = nil;
        }
    }
    return result;
}];

Когда монитор больше не нужен, удалите его, используя следующий код:

[NSEvent removeMonitor:_eventMonitor];
...