Pythonでマウスを制御する


206

Windowsでは、Pythonでマウスカーソルをどのように制御しますか、つまり、特定の位置に移動してクリックしますか?


1
ユーザーの介入なしに、コード内でマウスを動かす必要がありますか?
rahul、2009

詳細情報は本当に役に立ちます...
Gabriel Hurley

私はWindowsで起動し、ツールキットを使用していません。私はPythonが初めてで、GUIを使用したことがありません。どこから始めますか?どんなマニュアルを読むべきですか?
サーシャ

2
それを行うためにpythonが必要な理由、それを自分で行うことができるのですか?より深刻なメモでは、なぜそれが必要なのか、目的は何か、もう少し詳細があればすばらしいでしょう
Anurag Uniyal 2009

2
これを使用してマシンをロックしないようにしている場合、自動コンピューターロックプロパティを回避する手段であるため、会社または組織のセキュリティポリシーに違反している可能性があります。私はいくつかの場所でこれを使用しましたが、問題がないことを常にシステム管理者に確認してください。私は人々がこのような些細なことで仕事を失うのを見ました。
AlienAnarchist 2016年

回答:


329

pywin32(私の場合はpywin32-214.win32-py2.6.exe )をインストールした後、WinXP、Python 2.6(3.xもテスト済み)でテストしました。

import win32api, win32con
def click(x,y):
    win32api.SetCursorPos((x,y))
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,x,y,0,0)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,x,y,0,0)
click(10,10)

11
win32api.SetCursorPos((x,y))win32api.mouse_event(win32con.MOUSEEVENTF_MOVE | win32con.MOUSEEVENTF_ABSOLUTE, int(x/SCREEN_WIDTH*65535.0), int(y/SCREEN_HEIGHT*65535.0))私の経験では、ゲームなどの他のアプリケーションとの統合を改善するために、置き換えることをお勧めします。
ファルコン

1
@ObsessiveSSOℲはMOUSEEVENTF_ABSOLUTEフラグを外すだけです。:詳細については、msdn.microsoft.com/en-us/library/windows/desktop/...
ファルコン

このライブラリを使用してマウスの速度/加速を制御できますか?
誰かSomeoneelse 2014年

これには、50以上のウィンドウボックス(デジタルサイネージキオスク)に非標準のPythonモジュールをインストール(および関連する管理レビューと承認)する必要がないという利点がありました。
brichins

4
python3.x作品でもテストされていますので、お気軽に回答を編集してください
WhatsThePoint

132

PyAutoGUIモジュールで試してください。マルチプラットフォームです。

pip install pyautogui

など:

import pyautogui
pyautogui.click(100, 100)

その他の機能もあります。

import pyautogui
pyautogui.moveTo(100, 150)
pyautogui.moveRel(0, 10)  # move mouse 10 pixels down
pyautogui.dragTo(100, 150)
pyautogui.dragRel(0, 10)  # drag mouse 10 pixels down

これは、すべてのwin32conを実行するよりもはるかに簡単です。


14
すごい!マルチプラットフォームです!
2015

Pyautoguiは素晴らしいモジュールですが、残念ながら非常に遅いです。Ubuntuでは、1秒あたり2〜3回カーソルを移動します。信じられない!Pyuserinputは1000倍高速です。
Vladyslav Savchenko

1
pyautoguiをインストールしようとしている人は、stackoverflow.com / questions / 5892297 /…を参照してください。権限の問題がある場合は、コマンドの前に必ずsudoを付けてください。
retodaredevil

5
各呼び出しの後に0.1秒の休止を追加する安全機能のため、「PyAutoGUIは遅い」。スクリプトが制御不能になっている場合は、0.1秒以内にマウスを左上隅に叩いて停止できます。これを無効にするには、pyautogui.PAUSE = 0を実行します(ただし、マウス/キーボードを使用してスクリプトを停止することはできないため、これはお勧めできません。)
Al Sweigart

76

win32apiまたはctypesモジュールを使用して、マウスまたは任意のGUIを制御するためにwin32 APIを使用できます。

以下は、win32apiを使用してマウスを制御する楽しい例です。

import win32api
import time
import math

for i in range(500):
    x = int(500+math.sin(math.pi*i/100)*500)
    y = int(500+math.cos(i)*100)
    win32api.SetCursorPos((x,y))
    time.sleep(.01)

ctypesを使用したクリック:

import ctypes

# see http://msdn.microsoft.com/en-us/library/ms646260(VS.85).aspx for details
ctypes.windll.user32.SetCursorPos(100, 20)
ctypes.windll.user32.mouse_event(2, 0, 0, 0,0) # left down
ctypes.windll.user32.mouse_event(4, 0, 0, 0,0) # left up

11
あなたのctypesコードは追加のライブラリなしで私のために働きました!(Windows 7のpython 2.6)
intrepion '22

1
外部ライブラリを使用せずに!ありがとう
Akshat Agarwal 2015

2
ありがとうございました!これを行うことができるサードパーティのライブラリが3つあるなどとは言えませんが、3つのライブラリすべてがインストールやトラブルシューティングを行うのに煩わしくなっています。このctypesソリューションは最初のネイティブPythonソリューションであり、私が遭遇した他のどのソリューションよりもうまく機能します。
DuckPuncher

のドキュメントはどこにありSetCursorPosますか?
ArtOfWarfare 2017年

22

別のオプションは、クロスプラットフォームのAutoPyパッケージを使用することですです。このパッケージには、マウスを移動するための2つの異なるオプションがあります。

このコードスニペットは、カーソルを即座に位置(200,200)に移動します。

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

代わりに、カーソルを画面上で特定の場所に移動する場合は、smooth_moveコマンドを使用できます。

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

21

クロスプラットフォームのPyMouseをチェックしてください:https : //github.com/pepijndevos/PyMouse/


8
PyMouseはPyUserInputに取って代わられ、リクエストにぴったりフィットし使いやすくクロスプラットフォームです。ビッグ+1
user336851 2013年

@ user336851、PyUswerInputの使用方法tap spacetap screen shot key使用方法を知っていますか?
user3768495 2015

@ user336851、現時点でPyUserInputは壊れています。依存関係が壊れているためインストールできないため、うまく機能するかどうかはわかりません。
DuckPuncher

20

Linux

from Xlib import X, display
d = display.Display()
s = d.screen()
root = s.root
root.warp_pointer(300,300)
d.sync()

ソース:Pythonマウスは5行のコードで動きます(Linuxのみ)


20
「マウスの動きを制御するPython」のグーグルは、このページを見つけました。
Copas

2
完全を期すために、質問ではマウスのクリックをシミュレートすることも求められたため、追加しXlib.ext.xtest.fake_input(d, X.ButtonPress, 1); d.sync(); time.sleep(0.001); Xlib.ext.xtest.fake_input(d, X.ButtonRelease, 1); d.sync();ます。対象のアプリケーションによっては、プレスとリリースの間のsleep()コールが必要な場合と必要でない場合があります。
user336851 2013年

4
@Copas-Googleに表示される結果は何の意味もありません。あなたは泡の中にいます。これは、同じ用語のDuckDuckGo検索で表示されます。これは本当のことです。それは他の誰もが自分で再現して見ることができるものです。それはメタです。
ArtOfWarfare 2014

1
VNCセッションでマウスを制御するには、「d = display.Display( ':1')」のようにディスプレイ番号が必要です。ここで、:1はディスプレイ番号です。
Zafer

12

Pynputは、WindowsとMacの両方で私が見つけた最高のソリューションです。プログラミングが非常に簡単で、非常にうまく機能します。

例えば、

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)

Windowsコンピュータで古いプログラムを実行しようとしたところ、動作しませんでした。使用する前にテストしてください。このプログラムは、少なくとも両方をサポートすると主張しています。
プロQ

私はいくつかのテストを行いましたが、私の問題は、Macでは座標値として浮動小数点を使用しても問題なく機能することですが、Windowsでは座標が整数である必要があることがわかりました。このモジュールはクロスプラットフォームです。
プロQ

githubリポジトリにIssueを追加して、改善できるかどうかを確認しました:github.com/moses-palmer/pynput/issues/79
Pro Q

問題は修正されたようです。
プロQ

8

ライブラリclicksを使用してWindows 7でいつでもどこでも左クリックできる迅速で汚れた機能ctypes。ダウンロードは必要ありません。

import ctypes

SetCursorPos = ctypes.windll.user32.SetCursorPos
mouse_event = ctypes.windll.user32.mouse_event

def left_click(x, y, clicks=1):
  SetCursorPos(x, y)
  for i in xrange(clicks):
   mouse_event(2, 0, 0, 0, 0)
   mouse_event(4, 0, 0, 0, 0)

left_click(200, 200) #left clicks at 200, 200 on your screen. Was able to send 10k clicks instantly.

7

のとして2020年、あなたは使用することができ、マウスを

import mouse
mouse.move("500", "500")
mouse.left_click()

特徴

  • すべてのマウスデバイスのグローバルイベントフック(フォーカスに関係なくイベントをキャプチャ)。
  • マウスイベントをリッスンして送信します。
  • WindowsおよびLinuxで動作ます(sudoが必要です)。
  • 純粋なPython、コンパイルするCモジュールはありません。
  • 依存関係はありません。インストールして展開するのは簡単で、ファイルをコピーするだけです。
  • Python 2および3
  • 高レベルのAPIを含みます(例:記録と再生)。
  • 別のスレッドで自動的にキャプチャされたイベントはメインプログラムをブロックしません。
  • テストと文書化。

2

マウスを動かしたいなら、これを使ってください:

import pyautogui
pyautogui.moveTo(x,y)

クリックしたい場合は、これを使用します。

import pyautogui
pyautogui.click(x,y)

pyautoguiインストールしていない場合は、PythonをCMDにアタッチする必要があります。CMDに移動して、次のように記述します。pip install pyautogui

これがインストールされます pyautogui Python 2.x用れます。

Python 3.xの場合、おそらくpip3 install pyautoguiまたはを使用する必要がありpython3 -m pip install pyautoguiます。


現在の位置を基準にしてカーソルを移動するpyautogui.moveTo(x, y)ため、呼び出しをmove()行います。
Al Sweigart

ああ、申し訳ありませんが、元のコメントを誤解してしまいました。はい、両方の機能が動作します。moveTo()絶対位置にmove()移動し、現在のカーソル位置を基準に移動します。
Al Sweigart

1

もう1つの代替案はマウスライブラリです。比較的シンプルでクロスプラットフォームなので、私は個人的に使用しています。

これを使用する方法は次のとおりです。

import mouse
# move 100 right and 100 down with a duration of 0.5 seconds
mouse.move(100, 100, absolute=False, duration=0.5)
# left click
mouse.click('left')
# right click
mouse.click('right')

これがソースです:Pythonでマウスを制御する方法


1

受け入れられた答えは私にとってはうまくいきましたが、不安定でした(クリックが登録されない場合もある)ので、さらにMOUSEEVENTF_LEFTUPを追加しました。それからそれは確実に働いていました

import win32api, win32con
def click(x,y):
    win32api.SetCursorPos((x,y))
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,x,y,0,0) 
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,x,y,0,0)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,x,y,0,0)
click(10,10)

0

非常に簡単な1-インストールパッケージ:

pip install mouse

2-プロジェクトにライブラリを追加:

import mouse

3-例えばそれを使用してください:

mouse.right_click()

このURLでは、使用できるすべての関数について説明しています。

https://github.com/boppreh/mouse

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.