2012-03-26 35 views
9

Próbuję napisać prostą nagrywarkę makr w Pythonie dla OSX - coś, co może przechwycić zdarzenia myszy i klawiszy, gdy skrypt działa w tle i odtwarza je. Mogę użyć autopy dla tego ostatniego, czy istnieje podobna prosta biblioteka dla tego pierwszego?Czy mogę używać języka Python do przechwytywania zdarzeń klawiatury i myszy w systemie OSX?

+0

Niektóre pakiety wymienione tu mieć OS X wsparcia (np 'keyboard'): https://stackoverflow.com/questions/11918999/key -listers-w-python / –

Odpowiedz

0

Wydaje się, że nie ma sposobu, aby to zrobić w Pythonie na OSX.

1

Wiem, że można użyć curses do przechwytywania kluczowych danych wejściowych, ale nie jestem pewien co do wprowadzenia myszy. Nie tylko to, ale jeśli się nie mylę, jest zawarty w bibliotece standardowej z 2.7.2.

5

Dziś napotkałem kilka rozwiązań tego problemu i doszedłem do wniosku, że powrócę tutaj i podzielę się nimi, aby inni mogli zaoszczędzić czas wyszukiwania.

sprytne rozwiązanie krzyż platforma do symulacji klawiatury i myszy: http://www.autopy.org/

Znalazłem również krótkie ale działania (jak Mountain Lion) przykład jak globalnie zalogować naciśnięcia klawiszy. Jedynym zastrzeżeniem jest to, że musisz używać Python2.6, ponieważ 2.7 nie ma dostępnych modułów objc.

#!/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() 

Dla wejścia myszy, wystarczy zastąpić NSKeyDownMask z odpowiednią maskę z listy dostępnej tutaj: http://developer.apple.com/library/mac/#documentation/cocoa/Reference/ApplicationKit/Classes/NSEvent_Class/Reference/Reference.html#//apple_ref/occ/clm/NSEvent/addGlobalMonitorForEventsMatchingMask:handler:

Na przykład NSMouseMovedMask prace do śledzenia ruchów myszy. Stamtąd można uzyskać dostęp do event.locationInWindow() lub innych atrybutów.

-2

Calvin Cheng, dziękuję. Twoja sugestia działa w systemie OS X 10.8.5.

Kod z 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) 

jeszcze jedno rozwiązanie Key Listeners in python?

Powiązane problemy