2012-03-26 7 views
9

Sto provando a scrivere un semplice registratore di macro in Python per OSX, qualcosa che può catturare gli eventi del mouse e dei tasti mentre lo script viene eseguito in background e riprodurli. Posso usare autopy per quest'ultimo, c'è una libreria altrettanto semplice per il primo?Posso usare Python per catturare eventi di tastiera e mouse in OSX?

+0

Alcuni pacchetti di cui qui hanno il supporto OS X (ad esempio 'keyboard'): https://stackoverflow.com/questions/11918999/key -listeners-in-python / –

risposta

0

Non sembra esserci un modo per farlo in Python su OSX.

1

So che è possibile utilizzare curses per acquisire l'input da tastiera, ma non sono sicuro dell'input del mouse. Non solo, ma se non sbaglio è incluso nella libreria std con 2.7.2.

5

Mi sono imbattuto in alcune soluzioni a questo problema oggi e ho pensato di tornare indietro e condividere qui così altri potrebbero risparmiare il tempo di ricerca.

Una soluzione cross-platform ingegnoso per la simulazione di input da tastiera e mouse: http://www.autopy.org/

Ho trovato anche una breve ma di lavoro (come di Mountain Lion) esempio di come a livello globale il login colpi di chiave. L'unica avvertenza è che devi usare Python2.6 poiché 2,7 non sembra avere i moduli objc disponibili.

#!/usr/bin/python2.6 

"""PyObjC keylogger for Python 
by ljos https://github.com/ljos 
""" 

from Cocoa import * 
import time 
from Foundation import * 
from PyObjCTools import AppHelper 

class AppDelegate(NSObject): 
    def applicationDidFinishLaunching_(self, aNotification): 
     NSEvent.addGlobalMonitorForEventsMatchingMask_handler_(NSKeyDownMask, handler) 

def handler(event): 
    NSLog(u"%@", event) 

def main(): 
    app = NSApplication.sharedApplication() 
    delegate = AppDelegate.alloc().init() 
    NSApp().setDelegate_(delegate) 
    AppHelper.runEventLoop() 

if __name__ == '__main__': 
    main() 

Per input del mouse, è sufficiente sostituire NSKeyDownMask con la maschera relativa dall'elenco disponibile qui: http://developer.apple.com/library/mac/#documentation/cocoa/Reference/ApplicationKit/Classes/NSEvent_Class/Reference/Reference.html#//apple_ref/occ/clm/NSEvent/addGlobalMonitorForEventsMatchingMask:handler:

Per esempio, NSMouseMovedMask lavori per il monitoraggio dei movimenti del mouse. Da lì, è possibile accedere a event.locationInWindow() o ad altri attributi.

-2

Calvin Cheng, grazie. il tuo suggerimento funziona su OS X 10.8.5.

Codice da http://docs.python.org/faq/library.html#how-do-i-get-a-single-keypress-at-a-time

#!/usr/bin/python 

import termios, fcntl, sys, os 

fd = sys.stdin.fileno() 

oldterm = termios.tcgetattr(fd) 
newattr = termios.tcgetattr(fd) 
newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO 
termios.tcsetattr(fd, termios.TCSANOW, newattr) 

oldflags = fcntl.fcntl(fd, fcntl.F_GETFL) 
fcntl.fcntl(fd, fcntl.F_SETFL, oldflags | os.O_NONBLOCK) 

try: 
    while 1: 
     try: 
      c = sys.stdin.read(1) 
      print "Got character", repr(c) 
     except IOError: pass 
finally: 
    termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm) 
    fcntl.fcntl(fd, fcntl.F_SETFL, oldflags) 

Un'altra soluzione Key Listeners in python?