Mengontrol mouse dengan Python

206

Bagaimana cara mengontrol kursor mouse di Python, yaitu memindahkannya ke posisi tertentu dan klik, di bawah Windows?

Sasha
sumber
1
Apakah Anda perlu membuat gerakan mouse dalam kode tanpa campur tangan pengguna?
rahul
Informasi lebih lanjut akan sangat membantu ...
Gabriel Hurley
Saya bekerja di Windows dan saya tidak menggunakan toolkit apa pun. Saya benar-benar baru di Python dan saya tidak pernah bekerja dengan GUI sebelumnya. Dari mana saya memulai? Mannual apa yang harus saya baca?
Sasha
2
mengapa Anda perlu python untuk melakukan itu, Anda bisa melakukannya sendiri? pada catatan yang lebih serius, mengapa Anda membutuhkannya, apa tujuannya, sedikit lebih detail akan lebih bagus
Anurag Uniyal
2
Hanya FYI jika Anda menggunakan ini untuk menjaga mesin Anda dari penguncian Anda bisa melanggar kebijakan keamanan perusahaan atau organisasi Anda karena ini merupakan cara untuk menghindari properti penguncian komputer otomatis. Saya pernah menggunakan ini di beberapa tempat, tidak ada masalah, selalu pastikan untuk memeriksa dengan Admin Sys Anda. Saya pernah melihat orang kehilangan pekerjaan karena hal-hal kecil seperti ini.
AlienAnarchist

Jawaban:

329

Diuji pada WinXP, Python 2.6 (3.x juga diuji) setelah menginstal pywin32 (pywin32-214.win32-py2.6.exe dalam kasus saya):

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)
Jeffrey Kemp
sumber
11
win32api.SetCursorPos((x,y))lebih baik diganti oleh win32api.mouse_event(win32con.MOUSEEVENTF_MOVE | win32con.MOUSEEVENTF_ABSOLUTE, int(x/SCREEN_WIDTH*65535.0), int(y/SCREEN_HEIGHT*65535.0))pengalaman saya untuk integrasi yang lebih baik dengan aplikasi lain seperti game.
Falcon
1
@ ObsessiveSSOℲ lepas landas bendera MOUSEEVENTF_ABSOLUTE. untuk perincian: msdn.microsoft.com/en-us/library/windows/desktop/…
Falcon
dapatkah saya menggunakan perpustakaan ini untuk mengontrol kecepatan / akselerasi mouse?
Seseorang Seseorang
Ini memiliki keuntungan karena tidak memerlukan instalasi (dan tinjauan manajemen serta persetujuan terkait) modul Python non-standar di 50+ kotak windows (kios signage digital).
brichins
4
diuji dalam python3.xkarya juga, jangan ragu untuk mengedit jawabannya
WhatsThePoint
132

Coba dengan modul PyAutoGUI . Ini multi platform.

pip install pyautogui

Sehingga:

import pyautogui
pyautogui.click(100, 100)

Ini juga memiliki fitur lain:

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

Ini jauh lebih mudah daripada melalui semua hal win32con.

Al Sweigart
sumber
14
Bagus! Ini multi-platform!
les
Pyautogui adalah modul yang hebat, tapi sayangnya sangat lambat. Di Ubuntu, kursor bergerak 2-3 kali per detik. Luar biasa! Pyuserinput 1000x lebih cepat.
Vladyslav Savchenko
1
Untuk orang yang mencoba memasang pyautogui, lihat di sini stackoverflow.com/questions/5892297/... dan pastikan untuk menempatkan sudo di depan perintah Anda jika Anda memiliki masalah izin.
retodaredevil
5
"PyAutoGUI lambat" karena fitur keamanan yang menambahkan jeda 0,1 detik setelah setiap panggilan. Jika skrip Anda tidak terkendali, Anda dapat membanting mouse ke sudut kiri atas dalam 0,1 detik untuk menghentikannya. Untuk menonaktifkan ini, jalankan pyautogui.PAUSE = 0 (meskipun ini tidak disarankan, karena Anda tidak dapat menggunakan mouse / keyboard untuk menghentikan skrip.)
Al Sweigart
75

Anda dapat menggunakan win32apiatau ctypesmodul untuk menggunakan win32 apis untuk mengendalikan mouse atau gui apa pun

Berikut ini adalah contoh yang menyenangkan untuk mengontrol mouse menggunakan 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)

Satu klik menggunakan 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
Anurag Uniyal
sumber
11
kode ctypes Anda bekerja untuk saya tanpa perpustakaan tambahan! (python 2.6 di windows 7)
intrepion
1
Tanpa menggunakan perpustakaan eksternal! Terima kasih
Akshat Agarwal
2
Terima kasih! Saya tidak tahan bahwa ada seperti 3 perpustakaan pihak ke-3 yang dapat Anda lakukan dengan ini, namun semua 3 perpustakaan menjengkelkan untuk menginstal atau memecahkan masalah. Solusi ctypes ini adalah solusi python asli pertama dan bekerja lebih baik daripada yang saya temui.
DuckPuncher
Di mana dokumentasi untuk SetCursorPos?
ArtOfWarfare
22

Pilihan lain adalah menggunakan paket AutoPy lintas-platform . Paket ini memiliki dua opsi berbeda untuk menggerakkan mouse:

Cuplikan kode ini akan langsung memindahkan kursor ke posisi (200.200):

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

Jika Anda ingin kursor bergerak melintasi layar ke lokasi tertentu, Anda dapat menggunakan perintah smooth_move:

import autopy
autopy.mouse.smooth_move(200,200)
Gwen
sumber
21

Lihat platform silang PyMouse: https://github.com/pepijndevos/PyMouse/

Fabio Varesano
sumber
8
PyMouse telah digantikan dengan PyUserInput , sesuai persis dengan permintaan, mudah digunakan dan lintas platform. Besar +1
pengguna336851
@ user336851, apakah Anda tahu cara menggunakan tap spacedan tap screen shot keymenggunakan PyUswerInput?
user3768495
@ user336851, Saat ini PyUserInputrusak. Tidak dapat mengatakan apakah itu berfungsi dengan baik atau tidak karena saya bahkan tidak dapat menginstalnya karena dependensi yang rusak.
DuckPuncher
20

Linux

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

Sumber: Python mouse bergerak dalam 5 baris kode (hanya Linux) .

Simon
sumber
20
Sebuah google untuk "Python mengendalikan gerakan mouse" sekarang menemukan halaman ini, bagaimana meta.
Copas
2
Demi kelengkapan, karena pertanyaan juga diminta untuk mensimulasikan klik mouse, saya akan menambahkan: 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();panggilan sleep () antara pers dan rilis mungkin diperlukan atau mungkin tidak diperlukan tergantung pada aplikasi target.
user336851
4
@Copas - Hasil yang muncul di Google Anda tidak ada artinya. Anda berada dalam gelembung. Ini muncul dalam pencarian DuckDuckGo untuk istilah yang sama - itu sesuatu yang nyata. Itu adalah sesuatu yang dapat direproduksi dan dilihat sendiri oleh orang lain. Itu meta.
ArtOfWarfare
1
Untuk mengontrol mouse dalam sesi VNC, Anda memerlukan nomor tampilan juga seperti "d = display.Display (': 1')" di mana: 1 adalah nomor tampilan.
Zafer
12

Pynput adalah solusi terbaik yang saya temukan, baik untuk Windows maupun untuk Mac. Sangat mudah diprogram, dan bekerja dengan sangat baik.

Sebagai contoh,

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)
Pro Q
sumber
Saya hanya mencoba menjalankan program lama di komputer Windows dan tidak berhasil, jadi silakan lakukan pengujian sebelum menggunakannya. Program ini setidaknya mengklaim mendukung keduanya.
Pro Q
Saya melakukan beberapa pengujian, dan ternyata masalah saya adalah bahwa pada Mac, mengapung sebagai nilai koordinat berfungsi dengan baik, tetapi pada Windows, koordinatnya harus bilangan bulat. Modul ini adalah lintas platform.
Pro Q
Saya telah menambahkan Masalah ke repositori github untuk melihat apakah mereka dapat memperbaikinya: github.com/moses-palmer/pynput/issues/79
Pro Q
Sepertinya masalah telah diperbaiki.
Pro Q
8

Fungsi cepat dan kotor yang akan mengklik kiri di mana saja clickspada Windows 7 menggunakan ctypesperpustakaan. Tidak diperlukan unduhan.

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.
TankorSmash
sumber
7

Mulai tahun 2020 , Anda dapat menggunakan mouse :

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

fitur

  • Kait acara global pada semua perangkat tikus (menangkap acara tanpa fokus).
  • Dengarkan dan kirim acara mouse.
  • Bekerja dengan Windows dan Linux (memerlukan sudo).
  • Python murni, tidak ada modul C untuk dikompilasi.
  • Tanpa ketergantungan. Sepele untuk menginstal dan menyebarkan, cukup salin file.
  • Python 2 dan 3
  • Termasuk API tingkat tinggi (mis. Rekam dan mainkan.
  • Acara secara otomatis ditangkap di utas terpisah, tidak memblokir program utama.
  • Diuji dan didokumentasikan.
HUBUNGI19
sumber
2

Jika Anda ingin memindahkan mouse, gunakan ini:

import pyautogui
pyautogui.moveTo(x,y)

Jika Anda ingin mengklik, gunakan ini:

import pyautogui
pyautogui.click(x,y)

Jika Anda belum pyautoguimenginstal, Anda harus memasang python ke CMD. Pergi ke CMD dan tulis:pip install pyautogui

Ini akan menginstal pyautogui untuk Python 2.x.

Untuk Python 3.x, Anda mungkin harus menggunakan pip3 install pyautoguiatau python3 -m pip install pyautogui.

Destruktor_11
sumber
Anda ingin memanggil pyautogui.moveTo(x, y)karena move()menggerakkan kursor relatif ke posisi saat ini.
Al Sweigart
Ah, maaf saya salah mengerti komentar asli Anda. Ya, kedua fungsi berfungsi. moveTo()bergerak ke lokasi absolut, sementara move()bergerak relatif ke lokasi kursor saat ini.
Al Sweigart
1

Alternatif lain adalah perpustakaan mouse , saya pribadi menggunakannya karena relatif sederhana dan lintas platform.

Inilah cara Anda dapat menggunakannya:

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')

Inilah sumbernya: Cara Mengontrol Mouse Anda dengan Python

rockikz
sumber
1

Jawaban yang diterima berfungsi untuk saya tetapi tidak stabil (terkadang klik tidak akan berhasil) jadi saya menambahkan MOUSEEVENTF_LEFTUP tambahan . Kemudian itu bekerja dengan andal

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)
KoKlA
sumber
0

sangat mudah 1- instal pakage:

pip install mouse

2- tambahkan perpustakaan ke proyek:

import mouse

3 - menggunakannya misalnya:

mouse.right_click()

dalam url ini jelaskan semua fungsi yang dapat Anda gunakan:

https://github.com/boppreh/mouse

mamal
sumber