web-dev-qa-db-ja.com

Pythonを使用してMacでマウスを制御する方法は?

OSXでPython)を使用してマウスを動かす(そして場合によってはクリックする)最も簡単な方法は何でしょうか?

これはラピッドプロトタイピングのためだけのものであり、エレガントである必要はありません。

29
Ben

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バインディングを記述します!

9
Ben

このページ でコードを試してください。これは、2つの関数mousemovemouseclickを定義します。これらの関数は、PythonとプラットフォームのQuartzライブラリ間のAppleの統合にフックします。

このコードは10.6で動作し、私は10.7で使用しています。このコードの良いところは、マウスイベントを生成することですが、一部のソリューションでは生成されません。私はこれを使用して、Flashプレーヤーの既知のボタン位置にマウスイベントを送信することでBBC iPlayerを制御しています(私が知っている非常に脆弱です)。特に、マウス移動イベントは必須です。そうでない場合、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."
26
Mike Rhodes

このコードを試してみてください:

#!/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 leopard10.5.6で動作します

10
mrpollo

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)
9
GJ.

やりたいと思ったら 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)
8
Jeremy Banks

最も簡単な方法は、PyAutoGUIを使用することです。
例:

  • マウスの位置を取得するには:

    >>> pyautogui.position()
    (187, 567)
    
  • マウスを特定の位置に移動するには:

    >>> pyautogui.moveTo(100,200)
    
  • マウスクリックをトリガーするには:

    >>> pyautogui.click()
    

詳細: PyAutoGUI

5
biendltb

最善の策は、 AutoPyパッケージ を使用することです。使い方は非常に簡単で、クロスプラットフォームで起動できます。

カーソルを位置(200,200)に移動するには:

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

geekorgy.com のpythonスクリプト)は、新しいバージョンのpythonをインストールしたためにいくつかの問題が発生したことを除けば、すばらしいものです。解決策を探しています。

Mac OS10.6にPython 2.7をインストールした場合、Quartz.CoreGraphicsからインポートするpythonを取得するためのいくつかのオプションがあります:

A)ターミナルでは、スクリプトへのパスの前にpythonだけでなく、type python2.6

B)次のようにして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

C)次のことができますpythonパスを元のMacOS pythonにリセットします:

  • ターミナルで、次のように入力します。defaults write com.Apple.versioner.python Version 2.6

***また、画面上の(x、y)座標を見つける簡単な方法:

  1. Command+Shift+4(スクリーングラブの選択)を押します
  2. カーソルが座標を表示します
  3. 次に、Escキーを押して抜け出します。
1
dfred

最も簡単な方法は?コンパイル this Cocoaアプリを作成し、マウスの動きを渡します。

コードは次のとおりです。

// 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;
}

CGRemoteOperation.hヘッダーファイルからCGPostMouseEventを呼び出すクリックと呼ばれるアプリ。コマンドライン引数として座標を取り、マウスをその位置に移動してから、マウスボタンをクリックして放します。

上記のコードをclick.mとして保存し、ターミナルを開いて、ソースを保存したフォルダーに切り替えます。次に、gcc -o click click.m -framework ApplicationServices -framework Foundationと入力してプログラムをコンパイルします。コードよりもコメントが多いので、これをコンパイルする必要があることを恐れないでください。これは、1つの簡単なタスクを実行する非常に短いプログラムです。


別の方法?インポート pyobjc で、OSXフレームワークの一部にアクセスし、その方法でマウスにアクセスします。 (アイデアについては、最初の例のコードを参照してください)。

0
Rizwan Kassim

QuartzライブラリのCoreGraphicsを使用します。次に例を示します。

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

出典: GeekorgyページのTonyコメント

0
kenorb

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.pymouseUtils.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!")

両方のコードブロックを1つのファイルに結合し、実行権限を付与して、シェルスクリプトとして実行できます。

0
kenorb