用Python控制鼠标


206

在Windows下如何控制Python中的鼠标光标,即将其移动到特定位置并单击?


1
您是否需要在代码中移动鼠标而无需用户干预?
rahul

更多信息将是真正有帮助...
加布里埃尔赫利

我在Windows中工作,并且不使用任何工具包。我是Python的新手,以前从未使用过任何GUI。我从哪里开始?我应该读什么手法?
萨沙

2
为什么需要python来做到这一点,您可以自己做到?更重要的是,为什么需要它,目的是什么,更多细节会很棒
Anurag Uniyal

2
仅供参考,如果您使用它来防止计算机被锁定,则可能违反公司或组织的安全策略,因为这是绕过自动计算机锁定属性的一种手段。香港专业教育学院在某些地方使用此功能没问题,只是始终确保与您的系统管理员联系。我见过人们因为诸如此类的小事而失业。
AlienAnarchist

Answers:


329

在安装pywin32(在我的情况下为pywin32-214.win32-py2.6.exe )后,在WinXP上进行了Python 2.6(也已测试3.x)测试:

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

我可以使用该库来控制鼠标的速度/加速度吗?
某人Someoneelse 2014年

这样做的好处是,无需跨50多个窗口框(数字标牌亭)安装(以及相关的管理审查和批准)非标准Python模块。
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

76

您可以使用win32apictypes模块来使用Win32 API来控制鼠标或任何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代码对我有用,无需任何其他库!(在Windows 7上为python 2.6)
intrepion'2

1
无需使用任何外部库!谢谢
Akshat Agarwal 2015年

2
谢谢!我不能忍受可以使用3个第三方库,但是所有3个库都在疯狂安装或排除故障。这个ctypes解决方案是第一个本机python解决方案,它的工作原理比我遇到的其他解决方案都要好。
DuckPuncher '16

文档在哪里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 2013年

@ user336851,你知道如何tap spacetap screen shot key使用PyUswerInput?
user3768495

@ user336851,此时PyUserInput已损坏。无法说出它是否运行良好,因为由于依赖关系破裂,我什至无法安装它。
DuckPuncher '16

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
现在,一个用于“ Python控制鼠标移动”的Google会找到此页面,即meta。
巴拿马杯

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();根据目标应用程序,可能需要或可能不需要在press和release之间进行sleep()调用。
user336851 2013年

4
@Copas-搜索结果出现在您的Google中无济于事。你在泡沫中。这在DuckDuckGo搜索中显示了相同的词-这是真实的。这是其他所有人可以复制并看到的东西。那是元数据。
ArtOfWarfare 2014年

1
要在VNC会话中控制鼠标,您需要显示编号以及“ d = display.Display(':1')”,其中:1是显示编号。
Zafer

12

对于Windows和Mac,Pynput是我发现的最佳解决方案。超级容易编程,并且效果很好。

例如,

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仓库中添加了一个Issue,看他们是否可以改善它: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 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

接受的答案对我有用,但不稳定(有时单击不会重新注册),因此我添加了一个额外的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)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.