2011-11-20 3 views
6

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

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

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

+1

Не все Carbon устарели, просто детали GUI. –

ответ

14

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

+4

(что он построил) <- не то, что что-то не так с этим, но должен быть прозрачным – cwRichardKim

+0

Это работает только для ярлыков, которые еще не существуют в других приложениях? У меня проблемы с записью ярлыков, один из которых я видел в другом приложении. Также, если я изменяю ярлык по умолчанию, он не работает, и ключ, который не является ключом-модификатором, не работает ни в одном приложении, пока работает моя. Я хочу поймать cmd + c и alt + cmd + v –

13

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

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

Код, указанный на этой странице, предназначен для локального монитора событий, но код для глобального монитора событий аналогичен; какие изменения вызывается методом 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]; 
+0

Хотя это будет работать, это трудный путь. API API Carbon Event Manager по-прежнему поддерживается и упрощается и упрощается, и две сторонние оболочки Cocoa для него делают его еще проще. –

+4

Это не работает для ключевых событий, если приложение не доверено доступности. –

+0

Глобальный монитор не работает, локально у меня есть его, чтобы прослушать нажатие клавиши. Но я бы предположил, что люди ищут глобальную горячую клавишу :). – Rabiees

10

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

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

+0

Спасибо, Питер! Но я знаю, как регистрировать горячие клавиши. Это просто для меня. Я хочу записывать ключи от пользователя, поэтому мне нужно реализовать что-то вроде «горячей клавиши NSTextField» в окне настроек. –

+0

@VictorShcherbakov: ShortcutRecorder по-прежнему является лучшим способом сделать то, что я знаю. Он должен быть совместим с 64-разрядными версиями, по крайней мере, в версии соединительной линии. http://code.google.com/p/shortcutrecorder/ –

+0

shortcutrecorder (демо-приложение) не работает для меня на льве + xcode4. поэтому я все равно буду рад услышать другие параметры поля ввода, кроме shortcutrecorder – cyphunk

 Смежные вопросы

  • Нет связанных вопросов^_^