Управление мышью с помощью Python


206

Как управлять курсором мыши в Python, то есть перемещать его в определенную позицию и щелкать в Windows?


1
Вы хотите сделать движение мыши в коде без вмешательства пользователя?
Рахул

Дополнительная информация была бы очень полезна ...
Габриэль Херли

Я работаю в Windows и не использую какой-либо инструментарий. Я действительно новичок в Python и никогда раньше не работал с любым графическим интерфейсом. С чего начать? Какой мануал я должен прочитать?
Саша

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

2
Просто к вашему сведению, если вы используете это, чтобы защитить ваш компьютер от блокировки, вы можете нарушать политику безопасности вашей компании или организации, поскольку это способ обойти свойства автоматической блокировки компьютера. Я использовал это в некоторых местах без проблем, просто всегда проверяйте это у администраторов 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/...
Фалькон

я могу использовать эту библиотеку для управления скоростью / ускорением мыши?
Кто-то кто-то

Это имело преимущество в том, что не требовало установки (и соответствующей проверки и одобрения со стороны руководства) нестандартных модулей 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
Большой! Это мультиплатформенность!
Les

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

1
Если вы пытаетесь установить pyautogui, посмотрите здесь stackoverflow.com/questions/5892297/… и убедитесь, что sudo стоит перед вашими командами, если у вас есть проблемы с правами доступа.
retodaredevil

5
«PyAutoGUI работает медленно» из-за функции безопасности, которая добавляет 0,1-секундную паузу после каждого вызова. Если ваш сценарий вышел из-под контроля, вы можете нажать кнопку мыши в верхнем левом углу за эти 0,1 секунды, чтобы остановить его. Чтобы отключить это, запустите pyautogui.PAUSE = 0 (хотя это не рекомендуется, потому что вы не можете использовать мышь / клавиатуру, чтобы остановить сценарий.)
Al Sweigart

75

Вы можете использовать win32apiили ctypesмодуль для использования 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 работал для меня без каких-либо дополнительных библиотек! (Python 2.6 на Windows 7)
Intrepion

1
Без использования какой-либо внешней библиотеки! Спасибо
Акшат Агарвал

2
Спасибо! Я не могу смириться с тем, что есть 3 сторонние библиотеки, с которыми вы можете сделать это, однако все 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
user336851

@ user336851, знаете ли вы, как tap spaceи tap screen shot keyс помощью PyUswerInput?
user3768495

@ 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();вызов sleep () между нажатием и отпусканием может или не может потребоваться в зависимости от целевого приложения.
user336851

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, и она не сработала, поэтому, пожалуйста, проверьте ее перед использованием. Эта программа как минимум претендует на поддержку обоих.
Про Q

Я провел некоторое тестирование, и оказалось, что моя проблема заключалась в том, что на Mac наличие плавающих значений координат работает просто отлично, но в Windows координаты должны быть целыми числами. Этот модуль кроссплатформенный.
Про Q

Я добавил проблему в репозиторий github, чтобы посмотреть, смогут ли они улучшить ее: github.com/moses-palmer/pynput/issues/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 для компиляции.
  • Нулевые зависимости. Тривиально для установки и развертывания, просто скопируйте файлы.
  • 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()перемещает курсор относительно его текущей позиции.
Аль Суигарт

Ах, извините, я неправильно понял ваш оригинальный комментарий. Да, обе функции работают. moveTo()перемещается в абсолютную позицию, а move()перемещается относительно текущей позиции курсора.
Аль Суигарт

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.