ควบคุมเมาส์ด้วย Python


206

หนึ่งจะควบคุมเคอร์เซอร์ของเมาส์ใน Python เช่นย้ายไปยังตำแหน่งที่แน่นอนและคลิกภายใต้ Windows ได้อย่างไร


1
คุณจำเป็นต้องทำการเคลื่อนไหวเมาส์ในรหัสโดยไม่มีการแทรกแซงของผู้ใช้หรือไม่?
ราหุล

ข้อมูลเพิ่มเติมจะเป็นจริงที่เป็นประโยชน์ ...
กาเบรียลเฮอร์ลีย์

ฉัน wotk ใน Windows และฉันไม่ได้ใช้ชุดเครื่องมือใด ๆ ฉันยังใหม่กับ Python และฉันไม่เคยทำงานกับ GUI ใด ๆ มาก่อน ฉันจะเริ่มจากที่ไหน ฉันควรอ่านคู่มือแบบใด
Sasha

2
ทำไมคุณต้องใช้งูหลามในการทำเช่นนั้นคุณสามารถทำได้ด้วยตัวเอง? เมื่อทราบรุนแรงมากขึ้นว่าทำไมคุณต้องการสิ่งที่เป็นวัตถุประสงค์โดยมีรายละเอียดมากขึ้นอีกนิดจะดี
อนุรักษ์ 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งานด้วยเช่นกัน
อย่า

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 ครั้งต่อวินาที ! เหลือเชื่อ Pyuserinput เร็วกว่า 1000 เท่า
Vladyslav Savchenko

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)
บุกรุก

1
โดยไม่ต้องใช้ห้องสมุดภายนอกใด ๆ ! ขอบคุณ
Akshat Agarwal

2
ขอบคุณ! ฉันไม่สามารถยืนได้ว่ามีไลบรารี่ของบุคคลที่ 3 ที่คุณสามารถทำสิ่งนี้ได้ แต่ไลบรารี่ทั้ง 3 นั้นน่าคลั่งที่จะติดตั้งหรือแก้ไขปัญหา วิธีการแก้ปัญหา ctypes นี้เป็นวิธีการแก้ปัญหาแบบดั้งเดิมของงูหลามและทำงานได้ดีกว่าที่ฉันเคยเจอมา
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

ลินุกซ์

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

ที่มา: งูหลามย้ายเมาส์ใน 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 คือหมายเลขที่แสดง
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 และมันใช้งานไม่ได้ดังนั้นโปรดลองทดสอบก่อนใช้งาน อย่างน้อยโปรแกรมนี้อ้างว่าให้การสนับสนุนทั้งคู่
Pro Q

ฉันทำการทดสอบบางอย่างและปรากฎว่าปัญหาของฉันคือว่าบน Mac การลอยตัวเนื่องจากค่าพิกัดทำงานได้ดี แต่บน Windows พิกัดต้องเป็นจำนวนเต็ม โมดูลนี้เป็นข้ามแพลตฟอร์ม
Pro 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)
  • Pure Python ไม่มีโมดูล C ที่ต้องถูกคอมไพล์
  • การพึ่งพาเป็นศูนย์ ติดตั้งและปรับใช้เพียงเล็กน้อยเพียงคัดลอกไฟล์
  • Python 2 และ 3
  • มี API ระดับสูง (เช่นบันทึกและเล่น
  • เหตุการณ์ที่ถูกจับโดยอัตโนมัติในหัวข้อแยกไม่บล็อกโปรแกรมหลัก
  • ผ่านการทดสอบและจัดทำเป็นเอกสาร

2

หากคุณต้องการเลื่อนเมาส์ใช้สิ่งนี้:

import pyautogui
pyautogui.moveTo(x,y)

หากคุณต้องการคลิกใช้สิ่งนี้:

import pyautogui
pyautogui.click(x,y)

หากคุณยังไม่ได้pyautoguiติดตั้งคุณต้องมีงูใหญ่ติดอยู่กับ CMD ไปที่ CMD และเขียน:pip install pyautogui

สิ่งนี้จะติดตั้งpyautoguiสำหรับ Python 2.x

สำหรับงูหลาม 3.x คุณอาจจะต้องใช้หรือpip3 install pyautoguipython3 -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

คำตอบที่ได้รับการยอมรับทำงานให้ฉัน แต่มันก็ไม่แน่นอน (บางครั้งจะไม่คลิก regsiter) ดังนั้นฉันเพิ่มเพิ่มเติม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- ติดตั้ง pakage:

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.