Насколько мне известно, для этого нет библиотеки Python, поэтому вы будете вызывать собственные API. Хорошая новость заключается в том, что PyObjC (который поставляется со встроенным Python в последних выпусках ОС) часто упрощает эту задачу.
Есть два основных варианта. Чтобы любой из них работал, ваше приложение должно иметь цикл выполнения Cocoa/CoreFoundation (так же, как и в Windows, многие вещи требуют, чтобы вы были «исполняемым файлом графического интерфейса Windows», а не «исполняемым файлом командной строки»), что я выиграл не объяснить, как это сделать здесь. (Найдите хороший учебник по созданию приложений с графическим интерфейсом на Python, если вы не знаете, как это сделать, потому что это самый простой способ.)
Самый простой вариант — API глобального монитора событий Cocoa. Тем не менее, он имеет некоторые серьезные ограничения. Вы получаете только события, которые передаются другому приложению, а это означает, что мультимедийные клавиши, глобальные горячие клавиши и клавиши, которые по какой-либо причине игнорируются, не будут отображаться. Кроме того, вам нужно быть «доверенным для доступности». (Самый простой способ сделать это — попросить пользователя включить его глобально на панели «Универсальный доступ» в «Системных настройках».)
Жесткий вариант — это API касания событий Quartz. Это намного более гибко, и для этого требуются только соответствующие права (которые, в зависимости от используемых вами настроек, могут включать доверие к доступности и / или запуск от имени root), и это намного мощнее, но требует много больше работы, чтобы начать, и можно испортить вашу систему, если вы ошибетесь (например, съедая все нажатия клавиш и события мыши, чтобы они никогда не попадали в ОС, и вы не могли перезагрузиться, кроме как с помощью кнопки питания).
Ссылки на все соответствующие функции см. на странице https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/nsevent_Class/Reference/Reference.html (для NSEvent) и https://developer.apple.com/library/mac/#documentation/Carbon/Reference/QuartzEventServicesRef/Reference/reference.html (для событий Quartz). Небольшое гугление должно найти много примеров кода на Objective C (для NSEvent) или C (для CGEventTap), но мало или совсем ничего на Python, поэтому я покажу несколько небольших фрагментов, которые иллюстрируют, как вы портируете образцы для Python:
import Cocoa
def evthandler(event):
pass # this is where you do stuff; see NSEvent documentation for event
observer = Cocoa.NSEvent.addGlobalMonitorForEventsMatchingMask_handler_(NSKeyDown, evthandler)
# when you're done
Cocoa.NSEvent.removeMonitor_(observer)
import Quartz
def evthandler(proxy, type, event, refcon):
pass # Here's where you do your stuff; see CGEventTapCallback
return event
source = Quartz.CGEventSourceCreate(Quartz.kCGEventSourceStateHIDSystemState)
tap = Quartz.CGEventTapCreate(Quartz.kCGSessionEventTap,
Quartz.kCGHeadInsertEventTap,
Quartz.kCGEventTapOptionListenOnly,
(Quartz.CGEventMaskBit(Quartz.kCGEventKeyDown) |
Quartz.CGEventMaskBit(Quartz.kCGEventKeyUp)),
handler,
refcon)
Другой вариант, примерно того же уровня, что и события Quartz, — это события Carbon (начиная с InstallEventHandler). Тем не менее, Carbon устарел, и, кроме того, его сложнее получить из Python, поэтому, если у вас нет особой причины идти по этому пути, не делайте этого.
Есть и другие способы добраться до той же точки — например, использовать DYLD_INSERT_LIBRARIES или SIMBL, чтобы вставить некоторый код в каждое приложение, — но я не могу придумать ничего другого, что можно было бы сделать на чистом Python.
person
abarnert
schedule
12.06.2012