Контроль миші за допомогою Python


206

Як один керує курсором миші в Python, тобто переміщує його до певного положення та клацає під Windows?


1
Ви не повинні робити рух миші в коді без втручання користувача?
rahul

Більше інформації буде дуже корисною ...
Габріель Херлі

Я працюю в Windows, і я не використовую жодного набору інструментів. Я справді новачок у Python, і раніше ніколи не працював з жодним графічним інтерфейсом. З чого я починаю? Який щорічний я повинен прочитати?
Саша

2
чому для цього вам потрібен пітон, ви можете це зробити самостійно? на більш серйозну записку, навіщо це вам потрібно, яка мета, трохи більше деталей було б чудово
Anurag Uniyal

2
Просто FYI, якщо ви використовуєте це для запобігання блокування машини, ви можете порушити політику безпеки вашої компанії чи організації, оскільки це є способом обходу властивостей блокування автоматичного комп'ютера. Я використовував це в деяких місцях без проблем, завжди обов'язково зверніться до своїх адміністраторів Sys. Я бачив, як люди втрачають роботу через такі дрібні речі.
AlienAnarchist

Відповіді:


329

Тестовано на WinXP, Python 2.6 (також тестується 3.x) після встановлення pywin32 (у моєму випадку pywin32-214.win32-py2.6.exe):

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/…
Falcon

чи можу я використовувати цю бібліотеку для керування швидкістю / прискоренням миші?
Хтось Хтось хтось

Це мало перевагу в тому, що не вимагати встановлення (і пов'язаного з цим огляду управління та затвердження) нестандартних модулів Python у вікнах 50+ вікон (кіоски цифрових вивісок).
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
Чудово! Це багатоплатформа!
лес

Pyautogui - чудовий модуль, але, на жаль, дуже повільний. В Ubuntu він переміщує курсор 2-3 рази в секунду. Неймовірно! Піусерин вводиться в 1000 разів швидше.
Владислав Савченко

1
Для людей , які намагаються встановити pyautogui, дивіться тут stackoverflow.com/questions/5892297 / ... і переконайтеся в тому , Sudo перед вашими командами , якщо у вас є проблеми з дозволами.
retodaredevil

5
"PyAutoGUI повільний" через функцію безпеки, яка додає 0,1 секунди паузи після кожного дзвінка. Якщо ваш скрипт вийшов з-під контролю, ви можете засунути мишу в лівий верхній кут за ці 0,1 секунди, щоб зупинити його. Щоб вимкнути це, запустіть pyautogui.PAUSE = 0 (хоча це не рекомендується, оскільки ви не можете використовувати мишу / клавіатуру для зупинки сценарію.)
Al Sweigart

76

Ви можете використовувати win32apiабо ctypesмодуль, щоб використовувати win32 apis для управління мишкою або будь-яким gui

Ось цікавий приклад керування мишкою за допомогою 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 працював на мене без додаткових бібліотек! (python 2.6 на windows 7)
intrepion

1
Без використання жодної зовнішньої бібліотеки! Дякую
Акшат Агарвал

2
Дякую! Я не можу стверджувати, що є три бібліотеки сторонніх організацій, з якими ви можете це зробити, проте всі 3 бібліотеки з розуму встановлюють або усувають неполадки. Це рішення ctypes є першим нативним рішенням python, і воно працює краще, ніж усі інші, з якими я стикався.
DuckPuncher

Де знаходиться документація SetCursorPos?
ArtOfWarfare

22

Іншим варіантом є використання міжплатформного пакета AutoPy . У цьому пакеті є два різні варіанти переміщення миші:

Цей фрагмент коду миттєво перемістить курсор у положення (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
користувач336851

@ user336851, чи знаєте ви, як tap spaceі tap screen shot keyза допомогою PyUswerInput?
користувач3768495

@ 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
Google для "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();виклик режиму сну () між натисканням та випуском може знадобитися, а може і не знадобитися залежно від цільової програми.
користувач336851

4
@Copas - результати, які з’являються у вашій Google, нічого не означають. Ти в бульбашці. Це виявляється в пошуку DuckDuckGo за тим самим терміном - це щось реально. Це те, що всі інші можуть відтворити і побачити самі. Це мета.
ArtOfWarfare

1
Для управління мишею в сеансі VNC вам потрібен номер дисплея, як "d = display.Display (': 1')", де: 1 - номер дисплея.
Зафер

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, і вона не спрацювала, тому будь ласка, протестуйте її перед використанням. Ця програма принаймні претендує на підтримку обох.
Pro Q

Я зробив кілька тестувань, і виявилося, що моя проблема полягала в тому, що на Mac, маючи плаваючі значення координатних значень, добре працює, але в Windows, координати повинні бути цілими числами. Цей модуль є кросплатформним.
Pro Q

Я додав випуск у сховище github, щоб побачити, чи можуть вони його покращити: github.com/moses-palmer/pynput/isissue/79
Pro Q

Схоже, проблема з тих пір виправлена.
Pro 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 не потрібно компілювати.
  • Нульові залежності. Тривіально для встановлення та розгортання, просто скопіюйте файли.
  • Пітон 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

Ще одна альтернатива - бібліотека миші , я особисто використовую її, оскільки вона є відносно простою і крос-платформою.

Ось як ви можете ним користуватися:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.