с более приятным API для работы с кодом ObjC. В ARC вам нужно мостить. Пример:

отаю над приложением-репетитором для Mac OSX, которому нужно перенаправлять нажатия клавиш, даже когда приложение не в фокусе.

Есть ли способ заставить систему пересылать нажатия клавиш в приложение, возможно, через NSDistributedNotificationCenter? Я глупо нагуглил себя и не смог найти ответ ...

РЕДАКТИРОВАТЬ: Пример кода ниже.

Спасибо @NSGod за указание мне в правильном направлении - я закончил тем, что добавилмонитор глобальных событий используя метод addGlobalMonitorForEventsMatchingMask: handler:, который прекрасно работает. Для полноты моей реализации выглядит так:

// register for keys throughout the device...
[NSEvent addGlobalMonitorForEventsMatchingMask:NSKeyDownMask
                                       handler:^(NSEvent *event){

    NSString *chars = [[event characters] lowercaseString];
    unichar character = [chars characterAtIndex:0];

    NSLog(@"keydown globally! Which key? This key: %c", character);

}];

Для меня сложнее было использовать блоки, поэтому я дам небольшое описание на случай, если это кому-нибудь поможет:

В вышеприведенном коде следует отметить, что это всеодин единственный вызов метода на NSEvent. Блок предоставляется в качестве аргумента, напрямуюв функция. Вы можете думать об этом как о встроенном методе делегата. Только потому, что это заняло у меня некоторое время, я собираюсь проработать это шаг за шагом здесь:

[NSEvent addGlobalMonitorForEventsMatchingMask:NSKeyDownMask

Этот первый бит не проблема. Вы вызываете метод класса в NSEvent и сообщаете ему, какое событие вы хотите отслеживать, в данном случае NSKeyDownMask.список масок для поддерживаемых типов событий может быть найденВот.

Теперь мы подошли к хитрой части: обработчик, который ожидает блок:

handler:^(NSEvent *event){

Мне понадобилось несколько ошибок компиляции, чтобы понять это правильно, но (спасибо Apple) они были очень конструктивными сообщениями об ошибках. Первое, что нужно заметить, это карат ^. Это сигнализирует о начале блока. После этого в скобках

NSEvent *event

Который объявляет переменную, которую вы будете использовать в блоке для захвата события. Вы могли бы назвать это

NSEvent *someCustomNameForAnEvent

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

}];

И вы сделали! Это действительно что-то вроде «одной строки». Неважно, где вы выполняете этот вызов в вашем приложении - я делаю это в методе applicationDidFinishLaunching AppDelegate. Затем внутри блока вы можете вызывать другие методы из вашего приложения.

Ответы на вопрос(4)

Ваш ответ на вопрос