Вопрос

Каким будет самый простой способ перемещать мышь (и, возможно, щелкать) с помощью Python в OS X?

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

Это было полезно?

Решение 3

Я просмотрел исходный код Synergy, чтобы найти вызов, который генерирует события мыши:

#include <ApplicationServices/ApplicationServices.h>

int to(int x, int y)
{
    CGPoint newloc;
    CGEventRef eventRef;
    newloc.x = x;
    newloc.y = y;

    eventRef = CGEventCreateMouseEvent(NULL, kCGEventMouseMoved, newloc,
                                        kCGMouseButtonCenter);
    //Apparently, a bug in xcode requires this next line
    CGEventSetType(eventRef, kCGEventMouseMoved);
    CGEventPost(kCGSessionEventTap, eventRef);
    CFRelease(eventRef);

    return 0;
}

Теперь, чтобы написать привязки Python!

Другие советы

Попробуйте код по адресу эту страницу . Он определяет несколько функций, mousemove и mouseclick , которые подключаются к интеграции Apple между Python и библиотеками Quartz платформы.

Этот код работает на 10.6, и я использую его на 10.7. Хорошая особенность этого кода в том, что он генерирует события мыши, чего нет в некоторых решениях. Я использую его для управления BBC iPlayer, отправляя события мыши на известные позиции кнопок в их проигрывателе Flash (я знаю, что это очень хрупко). В частности, необходимы события перемещения мыши, так как в противном случае проигрыватель Flash никогда не скрывает курсор мыши. Такие функции, как CGWarpMouseCursorPosition не будут этого делать.

from Quartz.CoreGraphics import CGEventCreateMouseEvent
from Quartz.CoreGraphics import CGEventPost
from Quartz.CoreGraphics import kCGEventMouseMoved
from Quartz.CoreGraphics import kCGEventLeftMouseDown
from Quartz.CoreGraphics import kCGEventLeftMouseDown
from Quartz.CoreGraphics import kCGEventLeftMouseUp
from Quartz.CoreGraphics import kCGMouseButtonLeft
from Quartz.CoreGraphics import kCGHIDEventTap

def mouseEvent(type, posx, posy):
        theEvent = CGEventCreateMouseEvent(
                    None, 
                    type, 
                    (posx,posy), 
                    kCGMouseButtonLeft)
        CGEventPost(kCGHIDEventTap, theEvent)

def mousemove(posx,posy):
        mouseEvent(kCGEventMouseMoved, posx,posy);

def mouseclick(posx,posy):
        # uncomment this line if you want to force the mouse 
        # to MOVE to the click location first (I found it was not necessary).
        #mouseEvent(kCGEventMouseMoved, posx,posy);
        mouseEvent(kCGEventLeftMouseDown, posx,posy);
        mouseEvent(kCGEventLeftMouseUp, posx,posy);

Вот пример кода со страницы выше:

##############################################################
#               Python OSX MouseClick
#       (c) 2010 Alex Assouline, GeekOrgy.com
##############################################################
import sys
try:
        xclick=intsys.argv1
        yclick=intsys.argv2
        try:
                delay=intsys.argv3
        except:
                delay=0
except:
        print "USAGE mouseclick [int x] [int y] [optional delay in seconds]"
        exit
print "mouse click at ", xclick, ",", yclick," in ", delay, "seconds"
# you only want to import the following after passing the parameters check above, because importing takes time, about 1.5s
# (why so long!, these libs must be huge : anyone have a fix for this ?? please let me know.)
import time
from Quartz.CoreGraphics import CGEventCreateMouseEvent
from Quartz.CoreGraphics import CGEventPost
from Quartz.CoreGraphics import kCGEventMouseMoved
from Quartz.CoreGraphics import kCGEventLeftMouseDown
from Quartz.CoreGraphics import kCGEventLeftMouseDown
from Quartz.CoreGraphics import kCGEventLeftMouseUp
from Quartz.CoreGraphics import kCGMouseButtonLeft
from Quartz.CoreGraphics import kCGHIDEventTap
def mouseEventtype, posx, posy:
        theEvent = CGEventCreateMouseEventNone, type, posx,posy, kCGMouseButtonLeft
        CGEventPostkCGHIDEventTap, theEvent
def mousemoveposx,posy:
        mouseEventkCGEventMouseMoved, posx,posy;
def mouseclickposx,posy:
        #mouseEvent(kCGEventMouseMoved, posx,posy); #uncomment this line if you want to force the mouse to MOVE to the click location first (i found it was not necesary).
        mouseEventkCGEventLeftMouseDown, posx,posy;
        mouseEventkCGEventLeftMouseUp, posx,posy;
time.sleepdelay;
mouseclickxclick, yclick;
print "done."

Просто попробуйте этот код:

#!/usr/bin/python

import objc

class ETMouse():    
    def setMousePosition(self, x, y):
        bndl = objc.loadBundle('CoreGraphics', globals(), 
                '/System/Library/Frameworks/ApplicationServices.framework')
        objc.loadBundleFunctions(bndl, globals(), 
                [('CGWarpMouseCursorPosition', 'v{CGPoint=ff}')])
        CGWarpMouseCursorPosition((x, y))

if __name__ == "__main__":
    et = ETMouse()
    et.setMousePosition(200, 200)

это работает в OSX Leopard 10.5.6

Когда я захотел это сделать, я установил Jython и использовал java.awt.Robot класс. Если вам нужно создать скрипт на CPython, это явно не подходит, но когда вы можете выбирать что-либо, это хорошее кроссплатформенное решение.

import java.awt

robot = java.awt.Robot()

robot.mouseMove(x, y)
robot.mousePress(java.awt.event.InputEvent.BUTTON1_MASK)
robot.mouseRelease(java.awt.event.InputEvent.BUTTON1_MASK)

Библиотека pynput кажется лучшей в настоящее время поддерживаемой библиотекой. Позволяет контролировать и контролировать устройства ввода.

Вот пример для управления мышью:

from pynput.mouse import Button, Controller

mouse = Controller()

# Read pointer position
print('The current pointer position is {0}'.format(
    mouse.position))

# Set pointer position
mouse.position = (10, 20)
print('Now we have moved it to {0}'.format(
    mouse.position))

# Move pointer relative to current position
mouse.move(5, -5)

# Press and release
mouse.press(Button.left)
mouse.release(Button.left)

# Double click; this is different from pressing and releasing
# twice on Mac OSX
mouse.click(Button.left, 2)

# Scroll two steps down
mouse.scroll(0, 2)

Самый простой способ — использовать PyAutoGUI.
Пример:

  • Чтобы получить положение мыши:

    >>> pyautogui.position()
    (187, 567)
    
  • Чтобы переместить мышь в определенное положение:

    >>> pyautogui.moveTo(100,200)
    
  • Чтобы вызвать щелчок мыши:

    >>> pyautogui.click()
    

Более детально: PyAutoGUI

Скрипт Python из geekorgy.com это здорово, за исключением того, что я столкнулся с несколькими проблемами, так как установил более новую версию Python.Итак, вот несколько советов тем, кто, возможно, ищет решение.

Если вы установили Python 2.7 на свой Mac OS 10.6, у вас есть несколько вариантов импорта Python из Quartz.CoreGraphics:

А) В терминале тип python2.6 вместо того, чтобы просто python перед путем к скрипту

Б) Ты можешь установить PyObjC выполнив следующие действия:

  1. Установите easy_install из http://pypi.python.org/pypi/setuptools
  2. В терминале введите which python и скопируйте путь вверх через 2.7
  3. Затем введите easy_install –-prefix /Path/To/Python/Version pyobjc==2.3

    **т.е. easy_install –-prefix /Library/Frameworks/Python.framework/Versions/2.7 pyobjc==2.3

  4. Внутри типа скрипта import objc на вершине
  5. Если easy_install не работает с первого раза, возможно, сначала вам придется установить ядро:

    **т.е. easy_install --prefix /Library/Frameworks/Python.framework/Versions/2.7 pyobjc-core==2.3

С) Ты можешь сбросьте путь к Python к исходному питону Mac OS:

  • В терминале введите: defaults write com.apple.versioner.python Version 2.6

***Также быстрый способ узнать координаты (x,y) на экране:

  1. Нажимать Command+Shift+4 (выбор снимка экрана)
  2. Затем курсор показывает координаты
  3. Затем нажмите Esc, чтобы выйти из него.

Лучше всего использовать пакет AutoPy . Он чрезвычайно прост в использовании и кроссплатформенен для загрузки.

Чтобы переместить курсор в позицию (200 200):

import autopy
autopy.mouse.move(200,200)

Используйте CoreGraphics из библиотеки Quartz, например:

from Quartz.CoreGraphics import CGEventCreate
from Quartz.CoreGraphics import CGEventGetLocation
ourEvent = CGEventCreate(None);
currentpos = CGEventGetLocation(ourEvent);
mousemove(currentpos.x,currentpos.y)

Источник: Тони комментарий на странице Geekorgy .

Вот полный пример использования библиотеки Quartz :

#!/usr/bin/python
import sys
from AppKit import NSEvent
import Quartz

class Mouse():
    down = [Quartz.kCGEventLeftMouseDown, Quartz.kCGEventRightMouseDown, Quartz.kCGEventOtherMouseDown]
    up = [Quartz.kCGEventLeftMouseUp, Quartz.kCGEventRightMouseUp, Quartz.kCGEventOtherMouseUp]
    [LEFT, RIGHT, OTHER] = [0, 1, 2]

    def position(self):
        point = Quartz.CGEventGetLocation( Quartz.CGEventCreate(None) )
        return point.x, point.y

    def location(self):
        loc = NSEvent.mouseLocation()
        return loc.x, Quartz.CGDisplayPixelsHigh(0) - loc.y

    def move(self, x, y):
        moveEvent = Quartz.CGEventCreateMouseEvent(None, Quartz.kCGEventMouseMoved, (x, y), 0)
        Quartz.CGEventPost(Quartz.kCGHIDEventTap, moveEvent)

    def press(self, x, y, button=1):
        event = Quartz.CGEventCreateMouseEvent(None, Mouse.down[button], (x, y), button - 1)
        Quartz.CGEventPost(Quartz.kCGHIDEventTap, event)

    def release(self, x, y, button=1):
        event = Quartz.CGEventCreateMouseEvent(None, Mouse.up[button], (x, y), button - 1)
        Quartz.CGEventPost(Quartz.kCGHIDEventTap, event)

    def click(self, button=LEFT):
        x, y = self.position()
        self.press(x, y, button)
        self.release(x, y, button)

    def click_pos(self, x, y, button=LEFT):
        self.move(x, y)
        self.click(button)

    def to_relative(self, x, y):
        curr_pos = Quartz.CGEventGetLocation( Quartz.CGEventCreate(None) )
        x += current_position.x;
        y += current_position.y;
        return [x, y]

    def move_rel(self, x, y):
        [x, y] = to_relative(x, y)
        moveEvent = Quartz.CGEventCreateMouseEvent(None, Quartz.kCGEventMouseMoved, Quartz.CGPointMake(x, y), 0)
        Quartz.CGEventPost(Quartz.kCGHIDEventTap, moveEvent)

Приведенный выше код основан на следующих исходных файлах: Mouse.py < код> mouseUtils.py .

Вот демонстрационный код с использованием вышеуказанного класса:

# DEMO
if __name__ == '__main__':
    mouse = Mouse()
    if sys.platform == "darwin":
        print("Current mouse position: %d:%d" % mouse.position())
        print("Moving to 100:100...");
        mouse.move(100, 100)
        print("Clicking 200:200 position with using the right button...");
        mouse.click_pos(200, 200, mouse.RIGHT)
    elif sys.platform == "win32":
        print("Error: Platform not supported!")

Вы можете объединить оба блока кода в один файл, дать разрешение на выполнение и запустить его как сценарий оболочки.

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

Вот код:

// File:
// click.m
//
// Compile with:
// gcc -o click click.m -framework ApplicationServices -framework Foundation
//
// Usage:
// ./click -x pixels -y pixels
// At the given coordinates it will click and release.

#import <Foundation/Foundation.h>
#import <ApplicationServices/ApplicationServices.h>

int main(int argc, char **argv) {
  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
  NSUserDefaults *args = [NSUserDefaults standardUserDefaults];


  // grabs command line arguments -x and -y
  //
  int x = [args integerForKey:@"x"];
  int y = [args integerForKey:@"y"];

  // The data structure CGPoint represents a point in a two-dimensional
  // coordinate system.  Here, X and Y distance from upper left, in pixels.
  //
  CGPoint pt;
  pt.x = x;
  pt.y = y;


  // https://stackoverflow.com/questions/1483567/cgpostmouseevent-replacement-on-snow-leopard
  CGEventRef theEvent = CGEventCreateMouseEvent(NULL, kCGEventLeftMouseDown, pt, kCGMouseButtonLeft);
  CGEventSetType(theEvent, kCGEventLeftMouseDown);
  CGEventPost(kCGHIDEventTap, theEvent);
  CFRelease(theEvent);

  [pool release];
  return 0;
}
  

Приложение вызвало щелчок, который вызывает CGPostMouseEvent из заголовочного файла CGRemoteOperation.h. Он принимает координаты в качестве аргументов командной строки, перемещает мышь в эту позицию, затем щелкает и отпускает кнопку мыши.

     

Сохраните приведенный выше код как click.m, откройте терминал и перейдите в папку, в которой вы сохранили исходный код. Затем скомпилируйте программу, введя gcc -o click click.m -framework ApplicationServices -framework Foundation . Не пугайтесь необходимости компилировать это, так как комментариев больше, чем кода. Это очень короткая программа, которая выполняет одну простую задачу.

<Ч>

Другой способ? Импортируйте pyobjc , чтобы получить доступ к некоторым компонентам OSX и таким образом получить доступ к мыши. (см. код из первого примера для идей).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top