【Python】实现一个鼠标连击器,每秒点击1000次

news2024/11/17 15:26:57

image.png

前言

鼠标连击是指在很短的时间内多次点击鼠标按钮,通常是鼠标左键。当触发鼠标连击时,鼠标按钮会迅速按下和释放多次,产生连续的点击效果。

在这里鼠标连击的主要用途是:

  • 帮助我们进行鼠标点击,疯狂连击;
  • 例如在射击游戏中连续开火,如果点击就可以攻击怪物,那就可以持续不断的高频次地攻击怪物;
  • 通过鼠标连击,可以快速执行多个动作,提高操作效率。

问:本文使用Python可以实现多快的 鼠标连击呢?

答:如果不在每次鼠标点击之间添加睡眠时间,那么你的电脑会宕机,完全无法相应过来~


注意事项✨✨

本文主要实现的是Windows系统上的 鼠标连击 ,如果需要在其它平台如Linux、Mac系统实现鼠标连击,则可以使用跨平台的一些自动化模块,例如 pyautogui,或者是使用系统特有的模块,这里不做赘述。




本文使用的是ctypes库,它可以实现的鼠标连击速度非常快(特别是在与其它模块对比时候),原因如下:

  1. 直接调用操作系统函数:ctypes允许你直接调用操作系统的动态链接库(DLL)中的函数。在模拟鼠标点击时,ctypes可以直接调用操作系统提供的原生函数,从而绕过了pyautogui或其它库中的一些封装层和额外的处理逻辑,使得操作更加直接和高效。

  2. 无需依赖额外库和模块:ctypes是Python的标准库,无需安装额外的依赖库。相比之下,pyautogui库可能会依赖其他模块或库,这可能导致额外的加载时间和性能开销。

  3. 调用系统级别的API:ctypes通过调用操作系统级别的API来模拟鼠标点击。这些API通常是与操作系统更底层的交互接口,因此在执行速度上可能更为高效。

需要注意的是,使用ctypes库直接调用操作系统函数需要了解函数的参数和调用约定,并且代码可能会因为依赖于Windows操作系统而不具有可移植性。

总而言之,ctypes库在模拟鼠标点击时可能更快速是因为它直接调用了操作系统提供的原生函数,并且无需额外的依赖库和模块。

知识点📖📖

库和模块描述
ctypes用于在Python中调用动态链接库(DLL)和共享库的外部函数(这里用于鼠标点击)

据官网介绍,ctypes 是 Python 的外部函数库。它提供了与 C 兼容的数据类型,并允许调用 DLL 或共享库中的函数。可使用该模块以纯 Python 形式对这些库进行封装。

关于调用 ctypes 函数的步骤(具体的操作可以查阅官方文档):

  1. 首先,导入 ctypes 模块。
  2. 定义函数的参数类型和返回值类型,可以通过 argtypesrestype 属性进行设置。
  3. 使用 ctypes.windll 访问 Windows 动态链接库,并获取所需的函数。
  4. 调用函数并传递相应的参数。

这个模块就可以很好的实现本文的主题。

鼠标连击 实现

Python编程中,使用ctypes库中的SendInput函数。通过多次调用SendInput函数发送鼠标按下和释放的事件,可以模拟鼠标连击的效果。

需要注意的是,鼠标连击的频率和点击次数可能会受到操作系统或应用程序的限制。某些应用程序可能会有自己的点击速率限制,或者操作系统会对鼠标点击频率进行限制,以避免滥用或误操作。

代码

# encoding:utf-8

import time
import ctypes

# 定义鼠标事件常量
MOUSE_EVENT_LEFT_DOWN = 0x0002
MOUSE_EVENT_LEFT_UP = 0x0004


# 定义鼠标输入结构体
class MouseInput(ctypes.Structure):
    _fields_ = [("dx", ctypes.c_long),
                ("dy", ctypes.c_long),
                ("mouseData", ctypes.c_ulong),
                ("dwFlags", ctypes.c_ulong),
                ("time", ctypes.c_ulong),
                ("dwExtraInfo", ctypes.POINTER(ctypes.c_ulong))]


# 定义输入结构体
class Input(ctypes.Structure):
    class _INPUT(ctypes.Union):
        _fields_ = [("mi", MouseInput)]

    _anonymous_ = ("_input",)
    _fields_ = [("type", ctypes.c_ulong),
                ("_input", _INPUT)]


# 定义SendInput函数的参数类型
SendInput = ctypes.windll.user32.SendInput
SendInput.argtypes = (ctypes.c_uint, ctypes.POINTER(Input), ctypes.c_int)
SendInput.restype = ctypes.c_uint


# 定义鼠标点击函数
def click_mouse(count: int = 10):
    """模拟鼠标点击事件"""
    
    for i in range(count):
        # 创建一个鼠标左键按下事件
        mouse_down = Input()
        mouse_down.type = 0
        mouse_down.mi.dwFlags = MOUSE_EVENT_LEFT_DOWN

        # 创建一个鼠标左键释放事件
        mouse_up = Input()
        mouse_up.type = 0
        mouse_up.mi.dwFlags = MOUSE_EVENT_LEFT_UP

        # 将事件打包为输入结构体数组
        events = (Input * 2)()
        events[0] = mouse_down
        events[1] = mouse_up

        # 发送输入事件
        SendInput(2, events, ctypes.sizeof(Input))
        # 暂停一下
        time.sleep(0.01)


if __name__ == '__main__':
    click_mouse(count=100)

代码释义

  • MOUSE_EVENT_LEFT_DOWNMOUSE_EVENT_LEFT_UP 是表示鼠标左键按下和释放的常量;
  • MouseInput 是一个结构体,用于描述鼠标事件的信息,包括鼠标的坐标、鼠标数据、标志位、时间和附加信息等;
  • Input 是一个结构体,用于描述输入事件的信息,包括事件类型和事件的具体信息。这里使用了联合 _INPUT 来包含鼠标输入的信息;
  • SendInput 是 Windows 用户32库中的函数,用于发送输入事件。在这里,我们通过 ctypes 库进行函数的调用设置,指定了参数类型和返回值类型;
  • click_mouse 函数用于模拟鼠标点击事件。它接受一个可选的随机暂停时间列表作为参数,用于控制点击之间的间隔。首先创建鼠标按下和释放的事件,并将它们打包为输入结构体数组。然后使用 SendInput 函数发送输入事件,并通过 time.sleep 函数暂停一段时间。

在这个代码中,我们通过设置 SendInput 函数的参数类型和返回值类型,并使用 ctypes.windll.user32.SendInput 访问了 Windows 用户32库中的 SendInput 函数。然后在 click_mouse 函数中直接调用了 SendInput 函数来发送输入事件。

运行效果

在运行代码后,可以看到鼠标快速点击了100下。这就实现了鼠标连击器。

鼠标点击demo.gif

总结✨✨

本文介绍了 ctypes模块 的基本使用,并且使用 ctypes 实现 鼠标连击 的操作,

  • 首先,介绍了ctypes模块的基本使用方法,它可以用来调用动态链接库中的函数;
  • 然后,使用ctypes模块调用Windows API中的鼠标事件函数,实现了模拟鼠标按下和释放的功能;

通过本文的学习,读者可以了解到如何使用ctypes模块实现鼠标连击,结合键盘监听就可以进行更高级的操作。这对于需要进行大量鼠标点击的自动化任务或游戏操作来说非常有用。读者可以根据自己的需求进一步扩展和优化代码,以满足实际应用场景的要求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/676381.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NUCLEO-F411RE RT-Thread 体验 (6) - GCC环境 I2C驱动移植以及i2c-tool的编写

NUCLEO-F411RE RT-Thread 体验 (6) - GCC环境 I2C驱动移植以及i2c-tool的编写 1、I2C驱动移植 RT-Rhread这里用的是软件模拟i2c,stm32的驱动里并没有找到硬件i2c的驱动,但是在GD32里面却有硬件i2c的驱动,有兴趣的小伙伴可以根据gd32的代码写…

Ubutun开机黑屏解决方法

开机黑屏解决方法 临时性解决方法永久性解决方法补充说明 在项目支持过程中发现Ubuntu 16 在新终端上开机黑屏,没有显示图形界面,这个可能是因为系统版本太低,对新显卡不兼容导致的,后通过查资料有如下解决方法。 临时性解决方法 …

腾讯云+PicGo+Typora图床,生成专属图片链接

腾讯云PicGoTypora搭建自己的图床 原创声明,转载请注明文章链接来源、作者信息 TyporaPicGogitHub搭建自己的图床,写作效率大大提升 索奇问答 问:图床是什么? 答:用户可以将图片上传到图床,然后将生成的…

代码随想录算法训练营第四十一天 |

01背包:n种物品,每种物品只有1个,有相应的重量和价值 最多只能装m的重量,最多价值为多少? dp[i][j] : [0, i]物品任取放进容量为j的背包里 不放物品i:dp[i-1][j] 放物品i:dp[i-1][j-weight[…

递归的浅浅应用

首先,这里是一道简单题目,浅浅地验证了我之前发过的这篇文章 写递归题目的思路 ,我结合它来讲解一下这道题的思路: 剑指 Offer 27 和 method 226.翻转二叉树 给你一棵二叉树的根节点 root ,翻转这棵二叉树,…

python数据清洗 —— re.split()划分字符串

需求 对于一行字符串: route-views6.routeviews.org 141694 2a0c:b641:24f:fffe::7 184891 | CN | apnic | OTAKUJAPAN-AS Otaku Limited, CN要将其划分成如下7个部分, [route-views6.routeviews.org, 141694…

【C++篇】OOP下部分:友元、运算符重载与多态

友情链接:C/C系列系统学习目录 知识总结顺序参考C Primer Plus(第六版)和谭浩强老师的C程序设计(第五版)等,内容以书中为标准,同时参考其它各类书籍以及优质文章,以至减少知识点上的…

精选MyBatis面试题

什么是MyBatis? MyBatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,加载驱动、创建连接、创建statement等繁杂的过程,开发者开发时只需要关注如何编写SQL语句,可以严格控制sql执行性能&a…

Python高级语法--迭代器和生成器的区别

迭代器 在 Python 中,迭代器(iterator)是访问集合元素的一种方式,它可以遍历一个序列中的元素,而无需事先确定序列的大小(即无需全部载入到内存中),且支持惰性求值。使用迭代器可以…

程序员 35 岁以后就真的要返乡种田了么?如果家里没田怎么办?

前言 在科技互联网高速发展的当下,程序员这个职业无疑是备受关注的。然而,这个行业似乎总是被一种说法所笼罩:程序员年龄一旦超过35岁,就会面临职业生涯的下坡路,甚至需要考虑“返乡种田”。这种说法是否真实呢&#x…

【Software Testing】【期末习题库】【2023年春】【仅供参考】

文章目录 ①单选②多选③填空④判断⑤大题 类型总分占比平时成绩40%考试/考查60% 题型题量分值备注单选201’多选103’全对3’,错1个0’,少选-1’填空102’判断52’大题210’ 平时习题(3次): ①软件测试概述 ②黑盒测…

【五子棋实战】第5章 开发五子棋前端页面

【五子棋实战】第5章 开发五子棋前端页面 页面设计原则 开发页面 ## 基础HTML骨架 ## 添加页面响应式功能 编写JS ## 获取画布对象与DOM对象 ## 定义棋子、棋盘对象 ## 定义绘画对象(重要!!) ## 初始化绘制棋盘 ## 添加点…

Network 之十三 NC-SI 原理、拓扑结构、RBT 接口及仲裁、协议格式

最近,正在学习 NC-SI 的使用方法,于是开始各种 Google 查找 NC-SI 的资料进行学习。最详细还是得直接看 NC-SI 规范文档 DSP0222,以下就是记录的一些感觉 NC-SI 规范中比较重要的点以及我的一些理解,以备后续查阅。 有任何疑问&am…

OpenGL之模板测试

文章目录 模板测试模板函数物体轮廓源代码 模板测试 当片段着色器处理完一个片段之后,模板测试(Stencil Test)会开始执行,和深度测试一样,它也可能会丢弃片段。接下来,被保留的片段会进入深度测试,它可能会丢弃更多的片…

Git下:Git命令使用-详细解读

目录 一、Git 安装 二、Git 配置 三、Git 工作流程 四、Git 工作区、暂存区和版本库 五、常用 Git 命令清单 1. 创建仓库 2. 增加/删除文件 3. 代码提交 4. 分支管理 5. 标签 6. 查看历史提交 7. 远程仓库同步 8. 撤销操作 六、Git 常用命令速查表 七、Git 电子…

时序预测的深度学习算法全面盘点

1.概述 深度学习方法是一种利用神经网络模型进行高级模式识别和自动特征提取的机器学习方法,近年来在时序预测领域取得了很好的成果。常用的深度学习模型包括循环神经网络(RNN)、长短时记忆网络(LSTM)、门控循环单元&…

第五十一章 协助调查

眼前一个红彤彤的东西缓缓升起。 旭日东升?可现在才升未免太晚了些,升起的速度也未免太快了些,这红日么,也未免太小了些,而且,刚升起的朝阳,也未免显得太红太亮了些。 “是谁呀,水烧…

C语言数据存储 —— 浮点型篇

C语言数据存储 —— 浮点型篇 前言1. 一个常见问题2. 浮点数存储规则2.1 有效数字M一些特别的规定2.2 有效数字E一些特别的规定2.2.1 E如何存入内存2.2.2 E如何从内存中取出 3. 前面问题的解释。4. 结尾 前言 浮点数在内存中的存储方式对程序员来说非常重要。理解浮点数的存储…

数据结构:二叉树经典例题(单选题)-->你真的掌握二叉树了吗?(第一弹)

朋友们、伙计们,我们又见面了,本期来给大家解读一下有关二叉树的经典例题,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入门到精通 数…

消防通道堵塞识别 opencv

消防通道堵塞识别系统通过opencvpython网络模型技术,消防通道堵塞识别对消防通道的状态进行实时监测,检测到消防通道被堵塞时,将自动发出警报提示相关人员及时采取措施。OpenCV的全称是Open Source Computer Vision Library,是一个…