Цель-C: прослушивать сочетания клавиш и воздействовать на них - PullRequest
6 голосов
/ 26 мая 2011

Я занимаюсь разработкой приложения для Mac OS X, и мне нужно прослушивать ввод с клавиатуры, чтобы я мог на них реагировать.

Например:

  • Вверх и вниз клавиши перемещаются вверх и вниз в представлении таблицы.
  • + выпадает предмет.
  • + + N создает новый элемент.

Не должно быть ограничено событиями на сфокусированном элементе управления.

Есть идеи?

Заранее спасибо.

Ответы [ 3 ]

8 голосов
/ 27 мая 2011

Я думаю, что ваш лучший вариант * будет +[NSEvent addLocalMonitorForEventsMatchingMask:handler:].Это создает объект, который будет вызывать обработчик блока всякий раз, когда ваше приложение получает событие указанного типа.Обработка происходит непосредственно перед тем, как ваш NSApplication отправляет событие в окно, и у вас есть возможность изменить событие или остановить его дальнейшее продолжение.

Таким образом, вы можете перехватывать события нажатия клавиш по мере их передачив свое приложение и делайте с ними все, что захотите, прежде чем какой-либо элемент управления сможет их увидеть.Первоначально я опубликовал это в еще один вопрос , но вот фрагмент кода для действий с нажатиями клавиш со стрелками:

NSEvent * (^monitorHandler)(NSEvent *);
monitorHandler = ^NSEvent * (NSEvent * theEvent){

    switch ([theEvent keyCode]) {
        case 123:    // Left arrow
            NSLog(@"Left behind.");
            break;
        case 124:    // Right arrow
            NSLog(@"Right as always!");
            break;
        case 125:    // Down arrow
            NSLog(@"Downward is Heavenward");
            break;
        case 126:    // Up arrow
            NSLog(@"Up, up, and away!");
            break;
        default:
            break;
    }
    // Return the event, a new event, or, to stop 
    // the event from being dispatched, nil
    return theEvent;
};

// Creates an object we do not own, but must keep track of so that 
// it can be "removed" when we're done; therefore, put it in an ivar.
eventMon = [NSEvent addLocalMonitorForEventsMatchingMask:NSKeyDownMask 
                                                 handler:monitorHandler];

См. Руководство по обработке событий для некоторых деталейо том, что вы должны делать с этим объектом монитора.В частности, Apple, по-видимому, "не рекомендует" удалять его из dealloc, но не дает оснований.


* Пока вы можете потребовать Snow Leopard, по крайней мере.

3 голосов
/ 26 мая 2011

Возможно, вам потребуется реализовать обратные вызовы в вашем приложении.Посмотрите на CGEventTapCreate , чтобы начать прослушивание горячих клавиш.

CGEventTapCreate(kCGSessionEventTap,
             kCGTailAppendEventTap,
             kCGEventTapOptionDefault,
             kCGEventKeyDown
             myEventTapCallback,
             NULL);

myEventTapCallback должен соответствовать CGEventTapCallBack и вызываться при нажатии клавиши.Затем внутри myEventTapCallback у вас будет достаточно информации о нажатых клавишах, и вы сможете реализовать свои пользовательские функции.

2 голосов
/ 26 мая 2011

Взгляните на Руководство по обработке событий Какао . Есть несколько мест, где вы можете перехватывать события, прежде чем они попадут в представление ключа. Вы можете перехватывать все события в приложении, переопределяя -[NSApplication sendEvent:], или вы можете перехватывать события на уровне окна, переопределяя -[NSWindow sendEvent:].

...