Как получить события клавиатуры в окне NSStatusWindowLevel, пока мое приложение не является передним? - PullRequest
5 голосов
/ 27 ноября 2008

После создания полупрозрачного окна ( на основе примера кода Мэтта Джеммелла ) я хочу получить события клавиатуры в этом окне. Кажется, что есть только события клавиатуры, когда мое приложение является активным приложением, в то время как я хочу события клавиатуры, даже когда мое приложение не активно, но окно видно.

По сути, я хочу, чтобы поведение было таким, как в приложении Quicksilver (от blacktree).

У кого-нибудь есть намеки на то, как это сделать?

Ответы [ 3 ]

3 голосов
/ 27 ноября 2008

Есть два варианта:

  1. Для захвата событий клавиатуры используйте GetEventMonitorTarget() с привязанным циклом запуска углерода. Пример кода доступен на этой странице на CocoaDev.

  2. Зарегистрируйте ловушку событий с помощью CGEventTapCreate. Пример кода можно найти в этой теме в списке рассылки для разработчиков Apple.

Редактировать: Обратите внимание, что эти методы работают, только если вы отметили «Включить доступ для вспомогательных устройств» на панели настроек Универсального доступа.

1 голос
/ 27 ноября 2008

Более простой маршрут, который может работать лучше для вас, - сделать приложение исключительно фоновым. Обсуждение CocoaDev ключа LSUIElement plist объясняет, как его настроить. По сути, ваше приложение не будет отображаться в доке или переключателе приложений и не будет заменять строку меню текущего приложения при активации. С точки зрения пользователя, это никогда не «активное» приложение, но любые открытые окна могут активироваться и нормально реагировать на события. Единственное предостережение в том, что вам никогда не удастся отобразить строку меню, поэтому вам, вероятно, придется настроить NSStatusItem (одно из тех меню значков, которые отображаются в правой части строки меню) для управления (т. Е. Выйти , запиши префы и т. д.) ваше приложение.

Редактировать: я полностью забыл о флажке Неактивирующая панель в Интерфейсном Разработчике. Вам нужно использовать NSPanel вместо NSWindow, чтобы получить этот выбор. Этот параметр позволяет вашей панели принимать нажатия и ввод с клавиатуры без активации приложения. Готов поспорить, что QuickSilver для своего интерфейса использует комбинацию этого параметра и API Carbon Hot Keys.

0 голосов
/ 08 декабря 2008

Обновление:
На самом деле Apple, похоже, снова все изменила, начиная с 10,5 BTW (я недавно обновился, и мой пример кода не работал, как раньше).

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

Однако, используя обработчик углеродных событий и метод RegisterEventHotKey (), вы можете зарегистрировать горячую клавишу, и вы получите уведомление, когда она нажата, вам не нужно для этого иметь права root и не нужно ничего, как вспомогательные устройства , Я думаю, что Quicksilver, вероятно, делает это таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...