Есть ли способ узнать, из какого приложения пришло NSNotification/NSEvent?

Я начал слушать глобальные keyDown события. Есть ли способ получить информацию, из какого приложения пришло это событие?

Обработчик получает экземпляр NSNotification, а NSEvent является его частью. Могу ли я как-то извлечь эту информацию из этих объектов?

Фрагмент прослушивания:

[NSEvent addGlobalMonitorForEventsMatchingMask:NSKeyDownMask handler:^(NSEvent *event){
    NSLog(@"global keyDown %@", event);
    [[NSNotificationCenter defaultCenter] postNotificationName:kKeyPressed
                                                        object:event];

}];

Наблюдатель:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyEventHandler:)
                                             name:kKeyPressed
                                           object:nil];

ОБНОВЛЕНИЕ

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

[[NSWorkspace sharedWorkspace] activeApplication]

Это возвращает NSDictionary с необходимой мне информацией.


person lukaszb    schedule 08.11.2012    source источник
comment
Это будет в основном работать, но иногда активное приложение переключается к моменту запуска обработчика. (Для наиболее очевидного и повторяемого случая посмотрите, что вы получаете для события cmd-tab.) Надеюсь, это достаточно хорошо для вас, но если это не так, я хотел, чтобы вы знали заранее, а не преследовали это как необъяснимую ошибку 3 через несколько месяцев после того, как ваша программа была выпущена для широкой публики (потому что мы все по опыту знаем, как это может быть весело).   -  person abarnert    schedule 08.11.2012
comment
Спасибо за комментарий, и да, я уже принял это во внимание. Для приложения, над которым я работаю, этого пока вполне достаточно.   -  person lukaszb    schedule 09.11.2012


Ответы (1)


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

Между тем, вы создаете уведомления самостоятельно, поэтому, если вам нужно знать приложение, вы можете просто добавить это.

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

person abarnert    schedule 08.11.2012
comment
Спасибо, пометка как правильный ответ, поскольку это приводит меня к правильному решению (см. обновленный раздел в ответе). - person lukaszb; 08.11.2012