Что-то вроде pyHook на OS X

На самом деле я работаю с pyHook, но я хотел бы написать свою программу и для OS X. Если кто-то знает такой модуль ... Я некоторое время искал в Интернете, но ничего особенного.

-> Идея состоит в том, чтобы иметь возможность записывать нажатия клавиш вне приложения Python. Мое приложение представляет собой сборщик статистики сообщества, поэтому было бы здорово иметь статистику и из OS X.

Заранее спасибо ;)

Изменить: PyHook: запись нажатий клавиш и других действий вне приложения Python http://sourceforge.net/apps/mediawiki/pyhook/index.php?title=PyHook_Tutorial http://pyhook.sourceforge.net/doc_1.5.0/ http://sourceforge.net/apps/mediawiki/pyhook/index.php?title=Main_Page


person Carto_    schedule 12.06.2012    source источник
comment
Только что отредактировал презентацию. pyHook позволяет записывать нажатия клавиш (только в Windows) вне приложения Python, которое часто используется, например, для кейлоггеров. В моем случае я хотел бы построить статистику по ОС, об активности мыши, нажатиях клавиш и окнах (количество, время и т. д.). pyHook идеально подходит для этого в Windows, поэтому я пытаюсь понять, как это сделать в OS X :)   -  person Carto_    schedule 12.06.2012
comment
Здесь на SO есть несколько полезных тем: но они не обсуждают настоящие библиотеки: stackoverflow.com/questions/3258312/, stackoverflow.com/ вопросы/4809251/клавиатура-ввод-на-OSX   -  person Matthew Schinckel    schedule 12.06.2012
comment
Спасибо большое, посмотрю ;)   -  person Carto_    schedule 12.06.2012


Ответы (2)


Насколько мне известно, для этого нет библиотеки 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
comment
ОГРОМНОЕ СПАСИБО за развернутый и полный ответ! Я посмотрю на это и буду держать вас на связи здесь;) - person Carto_; 13.06.2012

Возможная быстрая альтернатива, возможно, это

https://github.com/gurgeh/selfspy Утверждается, что он работает как на Mac, так и на Windows. Он основан на pyhook в части окон.

Удачи.

person Jimmy MG Lim    schedule 05.05.2015