Поймать системное событие как Cmd-Tab или Spotlight в приложении Какао - PullRequest
5 голосов
/ 02 июня 2011

В приложении Какао я пытаюсь найти способ отлавливать системные события, такие как переключатель приложений, обычно запускаемый с помощью Cmd-Tab или spotlight, обычно запускаемый Cmd-Space. Я ищу способ поймать ключевое событие или другой способ сообщить мне, что одно из этих событий должно произойти, и в идеале отменить его.

Приложение удаленного рабочего стола Apple Screen Sharing делает это, так что это должно быть возможно. Он ловит эти события и отправляет их на подключенный удаленный компьютер.

Вот что я уже пробовал:

  • Перехват событий с помощью метода sendEvent в NSApplication. Я вижу все события, такие как нажатие клавиши Cmd, нажатие клавиши Tab, но когда нажимаются оба, я ничего не вижу.
  • Регистрация прослушивателя Carbon Hot key. Я могу зарегистрировать что-нибудь вроде Cmd + Q, но опять же, когда я регистрирую Cmd + Tab, он не отвечает.

Есть еще идеи?

Ответы [ 3 ]

2 голосов
/ 02 июня 2011
1 голос
/ 27 сентября 2011

Нашли это! В моем файле WindowViewController.m

#import <Carbon/Carbon.h>

void *oldHotKeyMode;

- (void)windowDidBecomeKey:(NSNotification *)notification{
    oldHotKeyMode = PushSymbolicHotKeyMode(kHIHotKeyModeAllDisabled);
}
- (void)windowDidResignKey:(NSNotification *)notification{
    PopSymbolicHotKeyMode(oldHotKeyMode);
}

Это довольно волшебно! и он отвечает новым требованиям Apple к песочнице для Mac App Store!

1 голос
/ 28 июня 2011

Я опишу как ловить вкладку cmd +. Но учтите, что это будет работать только в полноэкранном режиме. Я считаю, что в оконном режиме это невозможно. Код довольно прост. Это незначительное исправление кода SDL mac - обновление для обработки вкладки cmd + в полноэкранном режиме.

NSEvent *event = [NSApp nextEventMatchingMask:NSAnyEventMask 
    untilDate:[NSDate distantPast] inMode:NSDefaultRunLoopMode dequeue:YES ];
    if ( event == nil ) {
        break;
    }
if (([event type] == NSKeyDown) && 
    ([event modifierFlags] & NSCommandKeyMask)
 &&([[event characters] characterAtIndex:0] == '\t')
{
     do something here
}
...