Могу ли я использовать Python для захвата событий клавиатуры и мыши в OSX? - PullRequest
10 голосов
/ 26 марта 2012

Я пытаюсь написать простой Python для записи макросов для OSX - что-то, что может захватывать события мыши и клавиш, когда скрипт работает в фоновом режиме, и воспроизводить их.Я могу использовать autopy для последнего, есть ли подобная простая библиотека для первого?

Ответы [ 5 ]

6 голосов
/ 04 августа 2012

Сегодня я наткнулся на несколько решений этой проблемы и подумал, что мне нужно вернуться назад и поделиться ими, чтобы другие могли сэкономить время поиска.

Изящное кроссплатформенное решение для имитации ввода с клавиатуры и мыши: http://www.autopy.org/

Я также нашел краткий, но работающий (как у Mountain Lion) пример того, как глобально регистрировать нажатия клавиш.Единственное предостережение в том, что вы должны использовать Python2.6, поскольку в 2.7, похоже, нет доступных модулей 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()

Для ввода с помощью мыши просто замените NSKeyDownMask соответствующей маской из спискадоступно здесь: http://developer.apple.com/library/mac/#documentation/cocoa/Reference/ApplicationKit/Classes/NSEvent_Class/Reference/Reference.html#//apple_ref/occ/clm/NSEvent/addGlobalMonitorForEventsMatchingMask:handler:

Например, NSMouseMovedMask работает для отслеживания движений мыши.Оттуда вы можете получить доступ к event.locationInWindow () или другим атрибутам.

2 голосов
/ 26 марта 2012

Вот решение без использования curses:

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

Этот вопрос был задан некоторое время назад здесь - Кроссплатформенное прослушивание Python для нажатия клавиш?

Вы можете найти здесь пример кода!

1 голос
/ 26 марта 2012

Я знаю, что вы можете использовать curses для ввода с клавиатуры, но я не уверен в вводе мышью.Не только это, но если я не ошибаюсь, он включен в библиотеку std с 2.7.2.

0 голосов
/ 05 октября 2013

Calvin Cheng, спасибо. Ваше предложение работает на OS X 10.8.5.

Код от 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)

Еще одно решение Ключевые слушатели в python?

0 голосов
/ 03 июня 2012

Кажется, нет способа сделать это в Python для OSX.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...