Что-то вроде 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

2 ответа

Решение

Насколько я знаю, для этого нет библиотеки Python, поэтому вы будете вызывать нативные API. Хорошей новостью является то, что PyObjC (который поставляется со встроенным Python в последних выпусках ОС) часто делает это легко.

Есть два основных варианта. Чтобы все это работало, ваше приложение должно иметь рабочий цикл Cocoa/CoreFoundation (как и в Windows, для многих вещей требуется, чтобы вы были "исполняемым файлом Windows GUI", а не "исполняемым файлом командной строки"), который я выиграл Не объясните, как это сделать здесь. (Найдите хороший учебник по созданию приложений с графическим интерфейсом в 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.

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

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

Удачи.

Другие вопросы по тегам