Controlando o mouse com Python

206

Como se controla o cursor do mouse em Python, ou seja, move-o para determinada posição e clica em Windows?

Sasha
fonte
1
Você precisa fazer o movimento do mouse no código sem a intervenção do usuário?
rahul
Mais informações seria realmente útil ...
Gabriel Hurley
Eu trabalho no Windows e não uso nenhum kit de ferramentas. Eu sou realmente novo em Python e nunca trabalhei com nenhuma GUI antes. De onde eu começo? Que manual devo ler?
23415 Sasha
2
por que você precisa de um python para fazer isso, você pode fazer isso sozinho? Em uma nota mais séria, porque você precisa dele, qual é o propósito, um pouco mais detalhes seria ótimo
Anurag Uniyal
2
Apenas para sua informação, se você estiver usando isso para impedir o bloqueio da máquina, poderá estar violando a política de segurança da empresa ou das organizações, pois é um meio de burlar as propriedades de bloqueio automático do computador. Eu usei isso em alguns lugares, não há problema, sempre verifique com seus administradores de sistema. Eu já vi pessoas perderem seus empregos devido a coisas menores como essa.
precisa saber é o seguinte

Respostas:

329

Testado no WinXP, Python 2.6 (3.x também testado) após a instalação do pywin32 (pywin32-214.win32-py2.6.exe no meu caso):

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
fonte
11
win32api.SetCursorPos((x,y))é melhor ser substituído win32api.mouse_event(win32con.MOUSEEVENTF_MOVE | win32con.MOUSEEVENTF_ABSOLUTE, int(x/SCREEN_WIDTH*65535.0), int(y/SCREEN_HEIGHT*65535.0))na minha experiência para uma melhor integração com outros aplicativos, como jogos.
Falcon
1
@ ObsessiveSSOℲ basta tirar a bandeira MOUSEEVENTF_ABSOLUTE. para obter detalhes: msdn.microsoft.com/en-us/library/windows/desktop/…
Falcon
posso usar esta biblioteca para controlar a velocidade / aceleração do mouse?
Someone Someoneelse
Isso tinha a vantagem de não exigir a instalação (e a revisão e aprovação de gerenciamento associadas) de módulos Python não padrão em mais de 50 caixas de janelas (quiosques de sinalização digital).
Brichins
4
testado em python3.xobras também, fique à vontade para editar a resposta
WhatsThePoint
132

Tente com o módulo PyAutoGUI . É multiplataforma.

pip install pyautogui

E entao:

import pyautogui
pyautogui.click(100, 100)

Também possui outros recursos:

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

Isso é muito mais fácil do que passar por todas as coisas do win32con.

Al Sweigart
fonte
14
Ótimo! É multiplataforma!
les
Pyautogui é um ótimo módulo, mas infelizmente muito lento. No Ubuntu, ele move o cursor 2-3 vezes por segundo. Incrível! Pyuserinput é 1000x mais rápido.
Vladyslav Savchenko
1
Para pessoas que tentam instalar o pyautogui, consulte aqui stackoverflow.com/questions/5892297/… e certifique-se de colocar o sudo na frente dos seus comandos, se você tiver problemas de permissão.
retodaredevil
5
"PyAutoGUI está lento" devido a um recurso de segurança que adiciona uma pausa de 0,1 segundo após cada chamada. Se o seu script estiver fora de controle, você poderá bater com o mouse no canto superior esquerdo nesses 0,1 segundos para pará-lo. Para desativar isso, execute pyautogui.PAUSE = 0 (embora isso não é recomendado, porque você não pode usar o mouse / teclado para parar o script.)
Al Sweigart
76

Você pode usar win32apiou ctypesmodule para usar as APIs do win32 para controlar o mouse ou qualquer outra interface gráfica.

Aqui está um exemplo divertido para controlar o mouse usando o 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)

Um clique usando 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
fonte
11
seu código ctypes funcionou para mim sem bibliotecas adicionais! (python 2.6 no windows 7)
intrepion
1
Sem o uso de qualquer biblioteca externa! Obrigado
Akshat Agarwal
2
Obrigado! Não suporto que existam 3 bibliotecas de terceiros com as quais você pode fazer isso, no entanto, todas as 3 bibliotecas são loucas para instalar ou solucionar problemas. Essa solução ctypes é a primeira solução nativa de python e funciona melhor do que qualquer outra que eu tenha encontrado.
DuckPuncher
Onde está a documentação SetCursorPos?
ArtOfWarfare
22

Outra opção é usar o pacote AutoPy de plataforma cruzada . Este pacote possui duas opções diferentes para mover o mouse:

Este trecho de código moverá instantaneamente o cursor para a posição (200.200):

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

Se você deseja que o cursor se mova visivelmente pela tela para um determinado local, use o comando smooth_move:

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

Confira a plataforma cruzada PyMouse: https://github.com/pepijndevos/PyMouse/

Fabio Varesano
fonte
8
O PyMouse foi substituído pelo PyUserInput , se encaixa exatamente na solicitação, simples de usar e multiplataforma. Big +1
user336851
@ user336851, você sabe como tap spacee tap screen shot keyusando PyUswerInput?
user3768495
@ user336851, neste momento PyUserInputestá quebrado. Não posso dizer se funciona bem ou não, porque nem consigo instalá-lo devido a dependências quebradas.
DuckPuncher
20

Linux

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

Fonte: Mouse Python movido em 5 linhas de código (somente Linux) .

Simon
fonte
20
Um google para "Python controlando o movimento do mouse" agora encontra esta página, como meta.
Copas
2
Por uma questão de completude, como a pergunta também simulava cliques do mouse, acrescentarei: 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();a chamada sleep () entre a imprensa e o release pode ou não ser necessária, dependendo do aplicativo de destino.
user336851
4
@ Copas - Os resultados que aparecem no seu Google não significam nada. Você está em uma bolha. Isso aparece em uma pesquisa no DuckDuckGo pelo mesmo termo - isso é algo real. Isso é algo que todos os outros podem reproduzir e ver por si mesmos. Isso é meta.
ArtOfWarfare 27/08
1
Para controlar o mouse em uma sessão VNC, você precisa do número da tela, assim como "d = display.Display (': 1')" onde: 1 é o número da tela.
Zafer
12

Pynput é a melhor solução que encontrei, tanto para Windows quanto para Mac. Super fácil de programar e funciona muito bem.

Por exemplo,

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
fonte
Eu apenas tentei executar um programa antigo em um computador Windows e ele não funcionou; portanto, teste-o antes de usá-lo. Este programa pelo menos afirma apoiar ambos.
Pro Q
Fiz alguns testes e o problema era que no Mac, ter flutuações como valores de coordenadas funciona muito bem, mas no Windows, as coordenadas precisam ser inteiras. Este módulo é multiplataforma.
Pro Q
Eu adicionei um problema ao repositório do github para ver se eles podem melhorá-lo: github.com/moses-palmer/pynput/issues/79
Pro Q
Parece que o problema foi corrigido.
Pro Q
8

Função rápida e suja que clique com o botão esquerdo onde quer que esteja clicksno Windows 7 usando a ctypesbiblioteca. Não são necessários downloads.

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
fonte
7

A partir de 2020 , você pode usar o mouse :

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

Recursos

  • Gancho de evento global em todos os dispositivos de mouse (captura eventos independentemente do foco).
  • Escute e envie eventos do mouse.
  • Funciona com Windows e Linux (requer sudo).
  • Pure Python, sem módulos C a serem compilados.
  • Zero dependências. Trivial para instalar e implantar, basta copiar os arquivos.
  • Python 2 e 3
  • Inclui API de alto nível (por exemplo, gravar e reproduzir.
  • Eventos capturados automaticamente em thread separado, não bloqueiam o programa principal.
  • Testado e documentado.
CONvid19
fonte
2

Se você deseja mover o mouse, use o seguinte:

import pyautogui
pyautogui.moveTo(x,y)

Se você deseja clicar, use o seguinte:

import pyautogui
pyautogui.click(x,y)

Se você não tiver pyautoguiinstalado, você deve ter o python conectado ao CMD. Vá para o CMD e escreva:pip install pyautogui

Isso será instalado pyautoguino Python 2.x.

Para o Python 3.x, você provavelmente precisará usar pip3 install pyautoguior python3 -m pip install pyautogui.

Destruktor_11
fonte
Você deseja chamar pyautogui.moveTo(x, y)porque move()move o cursor em relação à sua posição atual.
Al Sweigart
Ah, desculpe, eu não entendi o seu comentário original. Sim, ambas as funções funcionam. moveTo()move para um local absoluto, enquanto move()se move em relação ao local atual do cursor.
Al Sweigart
1

Outra alternativa seria a biblioteca de mouses , eu pessoalmente a uso, pois é relativamente simples e multiplataforma.

Aqui está como você pode usá-lo:

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

Aqui está a fonte: Como controlar o mouse em Python

rockikz
fonte
1

A resposta aceita funcionou para mim, mas era instável (às vezes os cliques não seriam registrados), então eu adicionei um MOUSEEVENTF_LEFTUP adicional . Então estava trabalhando de forma confiável

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
fonte
0

muito fácil 1- instalar o pakage:

pip install mouse

2- adicione biblioteca ao projeto:

import mouse

3- use-o por exemplo:

mouse.right_click()

neste URL, descreva todas as funções que você pode usar:

https://github.com/boppreh/mouse

mamal
fonte