【问题标题】:Controlling mouse with Python用 Python 控制鼠标
【发布时间】:2010-11-13 23:11:14
【问题描述】:

在Python中如何控制鼠标光标,即在Windows下将鼠标移动到某个位置并点击?

【问题讨论】:

  • 您是否需要在没有用户干预的情况下在代码中移动鼠标?
  • 更多信息会真的有帮助...
  • 我在 Windows 中工作,我不使用任何工具包。我对 Python 很陌生,以前从未使用过任何 GUI。我从哪里开始?我应该阅读什么手册?
  • 为什么需要python来做,你可以自己做?更严肃地说,你为什么需要它,目的是什么,更多细节会很棒
  • 仅供参考,如果您使用它来防止计算机锁定,您可能违反了您的公司或组织的安全政策,因为它是一种规避自动计算机锁定属性的方法。我在某些地方使用过这个没问题,只是始终确保与您的系统管理员核实。我见过有人因为这样的小事而丢掉工作。

标签: python mouse


【解决方案1】:

在安装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)

【讨论】:

  • 根据我的经验,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)),以便更好地与游戏等其他应用程序集成。
  • @ObsessiveSSOℲ 只需取消 MOUSEEVENTF_ABSOLUTE 标志。详情:msdn.microsoft.com/en-us/library/windows/desktop/…
  • 我可以使用这个库来控制鼠标的速度/加速度吗?
  • 这样做的好处是不需要在 50 多个窗口框(数字标牌亭)中安装(以及相关的管理审查和批准)非标准 Python 模块。
  • python3.x 中测试也可以,请随时编辑答案
【解决方案2】:

尝试使用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 的东西要容易得多。

【讨论】:

  • 太棒了!它是多平台的!
  • Pyautogui 是一个很棒的模块,但是很慢。在 Ubuntu 中,它每秒移动光标 2-3 次。极好的! Pyuserinput 快 1000 倍。
  • 对于尝试安装 pyautogui 的人,请查看此处stackoverflow.com/questions/5892297/…,如果您有权限问题,请确保将 sudo 放在命令前面。
  • “PyAutoGUI 很慢”,因为有一项安全功能会在每次调用后添加 0.1 秒的暂停。如果您的脚本失控,您可以在那 0.1 秒内将鼠标猛击到左上角以停止它。要禁用此功能,请运行 pyautogui.PAUSE = 0(虽然不建议这样做,因为您不能使用鼠标/键盘来停止脚本。)
【解决方案3】:

您可以使用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

【讨论】:

  • 您的 ctypes 代码为我工作,无需任何额外的库! (Windows 7 上的 python 2.6)
  • 不使用任何外部库!谢谢
  • 谢谢!我无法忍受你可以使用 3 个第三方库来执行此操作,但是所有 3 个库都令人抓狂地安装或排除故障。这个 ctypes 解决方案是第一个原生 python 解决方案,它比我遇到的所有其他解决方案都好。
  • SetCursorPos 的文档在哪里?
  • 可以确认在没有任何额外库的情况下仍然可以工作。 (python 3.7.4 赢 10)
【解决方案4】:

截至2021,您可以使用mouse

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

特点

  • 所有鼠标设备上的全局事件挂钩(捕获事件,无论 重点)。
  • 监听并发送鼠标事件。
  • 适用于 Windows 和 Linux(需要 sudo)。
  • 纯 Python,无需编译 C 模块。
  • 零依赖。安装和部署很简单,只需复制 文件。
  • Python 2 和 3
  • 包括高级 API(例如录制和播放)。
  • 在单独的线程中自动捕获的事件,不会阻塞 main 程序。
  • 经过测试并记录在案。

安装

  • 窗口:pip install mouse
  • Linux:sudo pip install mouse

【讨论】:

  • 你也可以做mouse.move("500", "500", False)相对移动。
【解决方案5】:

另一种选择是使用跨平台的AutoPy package。这个包有两种不同的鼠标移动选项:

这段代码 sn-p 将立即将光标移动到位置 (200,200):

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

如果您希望光标在屏幕上明显移动到给定位置,您可以使用 smooth_move 命令:

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

【讨论】:

    【解决方案6】:

    Linux

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

    来源:Python mouse move in 5 lines of code (Linux only)

    【讨论】:

    • “Python 控制鼠标移动”的谷歌现在可以找到这个页面,如何元。
    • 为了完整起见,由于该问题还要求模拟鼠标点击,我将添加: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() 调用可能需要也可能不需要,具体取决于目标应用程序。
    • @Copas - 出现在您的 Google 中的结果毫无意义。你在泡沫中。这显示在 DuckDuckGo 搜索相同的术语中 - 这是真实的。这是每个人都可以复制并亲眼看到的东西。那是元数据。
    • 要在 VNC 会话中控制鼠标,您需要显示编号以及“d = display.Display(':1')”,其中 :1 是显示编号。
    【解决方案7】:

    查看跨平台 PyMouse:https://github.com/pepijndevos/PyMouse/

    【讨论】:

    • PyMouse 已被PyUserInput 取代,完全符合要求,使用简单且跨平台。大+1
    • @user336851,你知道如何使用 PyUswerInput 来 tap spacetap screen shot key 吗?
    • @user336851,此时PyUserInput坏了。不能说它是否运行良好,因为由于依赖关系损坏,我什至无法安装它。
    【解决方案8】:

    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 计算机上运行一个旧程序,但它不起作用,所以请在使用前进行测试。这个程序至少声称支持两者。
    • 我做了一些测试,结果发现我的问题是在 Mac 上,将浮点数作为坐标值工作得很好,但在 Windows 上,坐标必须是整数。这个模块是跨平台的。
    • 我在 github 存储库中添加了一个问题,看看他们是否可以改进它:github.com/moses-palmer/pynput/issues/79
    • 问题似乎已经解决了。
    【解决方案9】:

    使用ctypes 库在Windows 7 上左键单击clicks 次的快速而肮脏的功能。无需下载。

    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.
    

    【讨论】:

      【解决方案10】:

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

      【讨论】:

        【解决方案11】:

        另一种选择是mouse library,我个人使用它,因为它相对简单且跨平台。

        这里是你如何使用它:

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

        这里是来源:How to Control your Mouse in Python

        【讨论】:

          【解决方案12】:

          很简单 1-安装包:

          pip install mouse
          

          2- 将库添加到项目中:

          import mouse
          

          3- 以它为例:

          mouse.right_click()
          

          在这个 url 中描述你可以使用它的所有功能:

          https://github.com/boppreh/mouse

          【讨论】:

          • 它现在甚至支持 MAC。直接 pip 安装不适用于 MAC。您需要通过以下命令在 MAC 中安装: pip install pyobjc-framework-Quartz pip install git+github.com/boppreh/mouse.git
          【解决方案13】:

          如果你想移动鼠标,使用这个:

          import pyautogui
          pyautogui.moveTo(x,y)
          

          如果你想点击,使用这个:

          import pyautogui
          pyautogui.click(x,y)
          

          如果您没有安装pyautogui,则必须将python附加到CMD。去CMD写:pip install pyautogui

          这将为 Python 2.x 安装 pyautogui

          对于 Python 3.x,您可能必须使用 pip3 install pyautoguipython3 -m pip install pyautogui

          【讨论】:

          • 您需要调用pyautogui.moveTo(x, y),因为move() 会相对于当前位置移动光标。
          • 啊,对不起,我误解了您的原始评论。是的,这两个功能都有效。 moveTo() 移动到绝对位置,而move() 相对于当前光标位置移动。
          【解决方案14】:

          在屏幕上随机移动鼠标

          它会根据您的屏幕分辨率在屏幕上随机移动鼠标。 检查下面的代码。

          使用此命令安装pip install pyautogui

          import pyautogui
          import time
          import random as rnd
          
          #calculate height and width of screen
          w, h = list(pyautogui.size())[0], list(pyautogui.size())[1]
          
          while True:
              time.sleep(1)
              #move mouse at random location in screen, change it to your preference
              pyautogui.moveTo(rnd.randrange(0, w), 
                               rnd.randrange(0, h))#, duration = 0.1)
          

          【讨论】:

            【解决方案15】:

            如果您需要使用游戏。正如这篇文章 https://www.learncodebygaming.com/blog/pyautogui-not-working-use-directinput 中所解释的,一些游戏,如 Minecraft 或 Fortnite,有自己的注册鼠标/键盘事件的方式。控制鼠标和键盘事件的方法是使用全新的 PyDirectInput 库。他们的 github 仓库是https://github.com/learncodebygaming/pydirectinput,里面有很多很棒的信息。
            这是一个执行鼠标循环并单击的快速代码:

            import pydirectinput  # pip install pydirectinput
            
            
            pydirectinput.moveTo(0, 500)
            pydirectinput.click()
            

            【讨论】:

            • 这适用于协同集成多桌面和 VLC Directshow 输入。聪明的 AF。
            【解决方案16】:
            import ctypes
            from time import sleep
            
            SetCursorPos = ctypes.windll.user32.SetCursorPos
            print("Woohoo!\nTake Rest!\nMouse pointer will keep moving!\n\nPress ctrl+c to stop...!")
            while True:
                SetCursorPos(300, 300)
                sleep(2)
                SetCursorPos(500, 500)
                sleep(4)
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-09-29
              • 2010-09-21
              • 2018-11-15
              • 2010-12-29
              • 2011-05-04
              • 1970-01-01
              • 1970-01-01
              • 2020-06-07
              相关资源
              最近更新 更多