Algo como pyHook en OS X

Actualmente estoy trabajando con pyHook , pero también me gustaría escribir mi progtwig para OS X. Si alguien sabe un módulo así … He estado buscando en Internet por un tiempo, pero nada realmente relevante.

-> La idea es poder grabar las pulsaciones de teclas fuera de la aplicación python. Mi aplicación es un generador de estadísticas de la comunidad , por lo que también sería bueno tener estadísticas de OS X.

Gracias por adelantado 😉

Edición : PyHook: grabe las pulsaciones y otras cosas fuera de la aplicación 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

Por lo que sé, no hay una biblioteca de Python para esto, por lo que vas a llamar API nativas. La buena noticia es que PyObjC (que viene con el Python incorporado en las últimas versiones del sistema operativo) a menudo lo hace fácil.

Hay dos opciones principales. Para que cualquiera de estos funcione, su aplicación debe tener un runloop de Cocoa / CoreFoundation (al igual que en Windows, muchas cosas requieren que sea un “ejecutable GUI de Windows” en lugar de un “ejecutable de línea de comandos”), que gané No explique cómo hacerlo aquí. (Encuentre un buen tutorial para crear aplicaciones GUI en Python, si no sabe cómo hacerlo, porque esa es la forma más sencilla).

La opción fácil es la API del monitor de eventos globales de Cocoa. Sin embargo, tiene algunas limitaciones importantes. Solo obtienes eventos que van a otra aplicación, lo que significa que las teclas de medios, las teclas de acceso rápido globales y las teclas que se ignoren por cualquier motivo no se mostrarán. Además, debe ser “de confianza para la accesibilidad”. (La forma más sencilla de hacerlo es pedirle al usuario que lo active de forma global, en el panel Acceso universal de Preferencias del sistema).

La opción difícil es la API de toque de evento de cuarzo. Es mucho más flexible, y solo requiere exactamente los derechos apropiados (que, dependiendo de la configuración que use, puede incluir que se tenga confianza en la accesibilidad y / o que se ejecute como root), y es mucho más poderoso, pero requiere mucho más trabajo para comenzar, y es posible arruinar su sistema si lo hace mal (por ejemplo, al presionar todas las pulsaciones de teclas y eventos del mouse para que nunca lleguen al sistema operativo y no pueda reiniciar, excepto con el botón de encendido).

Para obtener referencias sobre todas las funciones relevantes, consulte https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/nsevent_Class/Reference/Reference.html (para NSEvent) y https: / /developer.apple.com/library/mac/#documentation/Carbon/Reference/QuartzEventServicesRef/Reference/reference.html (para eventos de cuarzo). Un poco de googlear debería mostrar un montón de código de muestra en Objective C (para NSEvent) o C (para CGEventTap), pero poco o nada en Python, así que mostraré algunos pequeños fragmentos que ilustran cómo portaría el muestras a 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) 

Otra opción, casi al mismo nivel que los eventos de cuarzo, son los eventos de carbono (que comienzan con InstallEventHandler). Sin embargo, Carbon está obsoleto, y además de eso, es más difícil acceder a Python, así que a menos que tenga alguna razón específica para hacerlo, no lo haga.

Hay otras formas de llegar al mismo punto, por ejemplo, usar DYLD_INSERT_LIBRARIES o SIMBL para insertar un código en cada aplicación, pero no puedo pensar en otra cosa que se pueda hacer en Python puro.

Una posible alternativa rápida tal vez esta

https://github.com/gurgeh/selfspy Se afirma que funciona tanto en mac como en windows. Se basa en pyhook en la parte de windows.

Buena suerte.