Глобальная горячая клавиша Cocoa NSStatusBar

Я создал приложение какао NSStatusBar, которое находится в строке состояния системы.

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

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

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

Спасибо.


Одно из руководств по горячим клавишам, которое я нашел, было на http://dbachrach.com/blog/2005/11/program-global-hotkeys-in-cocoa-easily/ для всех, кто заинтересован.


person Craig    schedule 01.11.2009    source источник
comment
Нет причин отображать меню, если оно не было нажато или оторвано.   -  person Azeem.Butt    schedule 01.11.2009


Ответы (2)


Существует реальный API горячих клавиш, который все еще существует в Snow Leopard и доступен в 64-разрядной версии. Он разработан специально для этой цели, в отличие от методов NSEvent, которые по сути являются просто блочной оболочкой CGEventTaps.

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

person Peter Hosey    schedule 01.11.2009
comment
Спасибо, это отлично работает. Вы не знаете, можно ли открыть всплывающее меню приложений с помощью кода? - person Craig; 02.11.2009
comment
Крейг: Да. См. комментарий Дэйва ДеЛонга к его ответу. - person Peter Hosey; 02.11.2009
comment
JFYI: прямо сейчас Apple отмечает эти методы как устаревшие, поэтому их больше нельзя использовать. - person Nickolay Olshevsky; 08.12.2011

Если вы нацелены на 10.6+, есть новый API для NSEvent, который может использовать глобальные горячие клавиши. Для получения дополнительной информации ознакомьтесь с этим замечательным сообщением в блоге: http://cocoakids.net/global-hotkeys-in-cocoa-on-snow-leopard

ИЗМЕНИТЬ (много времени спустя)

Немного подшучиваю над собственным рогом: я никогда не мог заставить такие вещи, как PTHotKey и другие библиотеки, работать так, как я ожидал, поэтому в конце концов я сдался и написал свою собственную оболочку HotKey. У него очень простой API (вы даете ему код ключа, модификаторы, цель и действие), который даже поддерживает такие забавные вещи, как блоки 10.6. Вы можете скачать исходный код здесь: http://github.com/davedelong/DDHotKey

person Dave DeLong    schedule 01.11.2009
comment
Спасибо за сообщение в блоге, он отлично работает, но я думаю, что я использую другой пример, чтобы он работал и в 10.5. Знаете ли вы, возможно ли открыть всплывающее меню приложений с помощью кода? - person Craig; 02.11.2009
comment
@Craig, вы можете сделать [myStatusItem popUpStatusItemMenu:[myStatusItem menu]], хотя это не выделит ваш статусный элемент (что отстойно). Единственная другая вещь, которую я бы предложил, - это подделать щелчок по элементу статуса. - person Dave DeLong; 02.11.2009
comment
cocoakids.net/global-hotkeys-in-cocoa-on-snow- leopard приведет вас к припаркованному домену. - person apaderno; 20.11.2011
comment
@kiamlaluno: В любом случае использование методов мониторинга событий NSEvent для горячих клавиш не так хорошо, поскольку вы получаете каждое событие клавиши и должны сами сопоставлять ключ. Лучше использовать Carbon Events (см. мой ответ) или одну из оберток, например DDHotKey. - person Peter Hosey; 20.11.2011
comment
@PeterHosey Я имел в виду ссылку, использованную в этом ответе, которая теперь никуда не ведет. - person apaderno; 20.11.2011
comment
@kiamlaluno: я знаю. Связанный пост был о методах монитора событий NSEvent. - person Peter Hosey; 20.11.2011
comment
@PeterHosey Я понял, но я просто указал, что первая половина, если ответ больше не полезен, так как он ссылается на гнилую ссылку. Я не говорил, какой метод предпочтительнее. - person apaderno; 21.11.2011