OSXでPython)を使用してマウスを動かす(そして場合によってはクリックする)最も簡単な方法は何でしょうか?
これはラピッドプロトタイピングのためだけのものであり、エレガントである必要はありません。
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バインディングを記述します!
このページ でコードを試してください。これは、2つの関数mousemove
とmouseclick
を定義します。これらの関数は、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."
このコードを試してみてください:
#!/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で動作します
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)
やりたいと思ったら 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)
最も簡単な方法は、PyAutoGUIを使用することです。
例:
マウスの位置を取得するには:
>>> pyautogui.position()
(187, 567)
マウスを特定の位置に移動するには:
>>> pyautogui.moveTo(100,200)
マウスクリックをトリガーするには:
>>> pyautogui.click()
詳細: PyAutoGUI
最善の策は、 AutoPyパッケージ を使用することです。使い方は非常に簡単で、クロスプラットフォームで起動できます。
カーソルを位置(200,200)に移動するには:
import autopy
autopy.mouse.move(200,200)
geekorgy.com のpythonスクリプト)は、新しいバージョンのpythonをインストールしたためにいくつかの問題が発生したことを除けば、すばらしいものです。解決策を探しています。
Mac OS10.6にPython 2.7をインストールした場合、Quartz.CoreGraphicsからインポートするpythonを取得するためのいくつかのオプションがあります:
A)ターミナルでは、スクリプトへのパスの前にpython
だけでなく、type python2.6
B)次のようにしてPyObjCをインストールできます。
which python
と入力し、パスを2.7
までコピーします。次に、easy_install –-prefix /Path/To/Python/Version pyobjc==2.3
と入力します
**すなわち。 easy_install –-prefix /Library/Frameworks/Python.framework/Versions/2.7 pyobjc==2.3
import objc
と入力します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)座標を見つける簡単な方法:
Command+Shift+4
(スクリーングラブの選択)を押します最も簡単な方法は?コンパイル 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フレームワークの一部にアクセスし、その方法でマウスにアクセスします。 (アイデアについては、最初の例のコードを参照してください)。
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コメント 。
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!")
両方のコードブロックを1つのファイルに結合し、実行権限を付与して、シェルスクリプトとして実行できます。