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?
Odpowiedz
Wydaje się, że nie ma sposobu, aby to zrobić w Pythonie na OSX.
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.
Oto rozwiązanie bez użycia curses
:
http://docs.python.org/faq/library.html#how-do-i-get-a-single-keypress-at-a-time
To pytanie został poproszony jakiś czas z powrotem tutaj - Python cross-platform listening for keypresses?
Można znaleźć kod przykładowy tam pomocne!
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.
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?
Niektóre pakiety wymienione tu mieć OS X wsparcia (np 'keyboard'): https://stackoverflow.com/questions/11918999/key -listers-w-python / –