【使用Python编写游戏辅助工具】第三篇:鼠标连击器的实现

前言
这里是【使用Python编写游戏辅助工具】的第三篇:鼠标连击器的实现。本文主要介绍使用
Python来实现鼠标连击功能。
鼠标连击是指在很短的时间内多次点击鼠标按钮,通常是鼠标左键。当触发鼠标连击时,鼠标按钮会迅速按下和释放多次,产生连续的点击效果。
在这里鼠标连击的主要用途是:
- 帮助我们进行鼠标点击,疯狂连击;
- 例如在射击游戏中连续开火,如果点击就可以攻击怪物,那就可以持续不断的高频次地攻击怪物;
- 通过鼠标连击,可以快速执行多个动作,提高操作效率。
文章脉络概述
本文的流程和功能如下图所示:
-
结合上篇文章的
键盘监听来实现一个收放自如的鼠标连击功能; -
通过键盘监听事件去驱动一些操作(
键盘监听功能主要配合后面的鼠标连击使用);- 当按下 Ctrl + Shift + A 时候,进行 鼠标连击(键盘的组合键可以自定义)
- 当按下 Ctrl + Shift + Q 时候,进行 停止连击(键盘的组合键可以自定义)
鼠标连击通常用于游戏或某些应用程序中的快速操作,例如在射击游戏中连续开火。通过鼠标连击,可以快速执行多个动作,提高操作效率。
系列文章脉络
系列文章内容大体如下,后续可能会更新新的文章。
-
点击直达:【使用Python编写游戏辅助工具】第一篇:概述
-
点击直达:【使用Python编写游戏辅助工具】第二篇:键盘监听的应用
-
点击直达:【使用Python编写游戏辅助工具】第三篇:鼠标连击器的实现
-
点击直达:【使用Python编写游戏辅助工具】第四篇:Windows窗口操作
-
点击直达:【使用Python编写游戏辅助工具】第五篇:打造交互式游戏工具界面:PySide6/PyQT高效构建GUI工具
知识点📖📖
| 库和模块 | 描述 |
|---|---|
| ctypes | 用于在Python中调用动态链接库(DLL)和共享库的外部函数(这里用于鼠标点击) |
据官网介绍,ctypes 是 Python 的外部函数库。它提供了与 C 兼容的数据类型,并允许调用 DLL 或共享库中的函数。可使用该模块以纯 Python 形式对这些库进行封装。
关于调用 ctypes 函数的步骤(具体的操作可以查阅官方文档):
- 首先,导入
ctypes模块。 - 定义函数的参数类型和返回值类型,可以通过
argtypes和restype属性进行设置。 - 使用
ctypes.windll访问 Windows 动态链接库,并获取所需的函数。 - 调用函数并传递相应的参数。
这个模块就可以很好的实现本文的主题。
鼠标连击 实现
在
Python编程中,使用ctypes库中的SendInput函数。通过多次调用SendInput函数发送鼠标按下和释放的事件,可以模拟鼠标连击的效果。
需要注意的是,鼠标连击的频率和点击次数可能会受到操作系统或应用程序的限制。某些应用程序可能会有自己的点击速率限制,或者操作系统会对鼠标点击频率进行限制,以避免滥用或误操作。
代码
# encoding=utf-8import 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 = 0mouse_down.mi.dwFlags = MOUSE_EVENT_LEFT_DOWN# 创建一个鼠标左键释放事件mouse_up = Input()mouse_up.type = 0mouse_up.mi.dwFlags = MOUSE_EVENT_LEFT_UP# 将事件打包为输入结构体数组events = (Input * 2)()events[0] = mouse_downevents[1] = mouse_up# 发送输入事件SendInput(2, events, ctypes.sizeof(Input))# 暂停一下time.sleep(0.01)if __name__ == '__main__':click_mouse(count=100)
代码释义
MOUSE_EVENT_LEFT_DOWN和MOUSE_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下。这就实现了鼠标连击器。

键盘监听 启动 鼠标连击
在这一part,结合上篇文章的键盘监听和上面的鼠标连击代码,我们可以实现一个通过快捷键去操控鼠标连击的功能。
使用快捷键去操作的好处是收放自如。
代码
# encoding=utf-8import time
import ctypes
import keyboard
import threading# 定义鼠标事件常量
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_uintflag = False# 定义鼠标点击函数
def click_mouse():"""模拟鼠标点击事件"""while flag:# 创建一个鼠标左键按下事件mouse_down = Input()mouse_down.type = 0mouse_down.mi.dwFlags = MOUSE_EVENT_LEFT_DOWN# 创建一个鼠标左键释放事件mouse_up = Input()mouse_up.type = 0mouse_up.mi.dwFlags = MOUSE_EVENT_LEFT_UP# 将事件打包为输入结构体数组events = (Input * 2)()events[0] = mouse_downevents[1] = mouse_up# 发送输入事件SendInput(2, events, ctypes.sizeof(Input))# 暂停一下time.sleep(0.01)def start_keyboard_listener():"""开始键盘监听的回调函数"""global flagflag = Trueprint("Ctrl+Shift+A pressed")threading.Thread(target=click_mouse).start()def stop_keyboard_listener():"""停止键盘监听的回调函数"""global flagflag = Falseprint("Ctrl+Shift+Q pressed")if __name__ == '__main__':# 注册热键,设置回调函数keyboard.add_hotkey('ctrl+shift+a', start_keyboard_listener)keyboard.add_hotkey('ctrl+shift+q', stop_keyboard_listener)# 进入监听状态keyboard.wait()
代码释义
这份代码实现了通过热键启动和停止鼠标点击的监听功能。
-
click_mouse()函数定义了鼠标点击的操作,具体的实现在你之前提供的代码中。 -
start_keyboard_listener()函数是开始键盘监听的回调函数。当按下热键 “Ctrl+Shift+A” 时,该函数被触发。它将设置一个全局变量flag为True,然后创建一个新的线程,并在该线程中调用click_mouse()函数,从而实现鼠标点击的连击效果。 -
stop_keyboard_listener()函数是停止键盘监听的回调函数。当按下热键 “Ctrl+Shift+Q” 时,该函数被触发。它将设置全局变量flag为False,从而停止鼠标点击的连击效果。 -
在
__main__部分,通过keyboard.add_hotkey注册了两个热键,分别对应开始和停止键盘监听的回调函数。然后调用keyboard.wait()进入监听状态,等待热键的触发。
总体来说,这份代码实现了通过热键控制鼠标点击的连击效果。按下 “Ctrl+Shift+A” 启动连击,按下 “Ctrl+Shift+Q” 停止连击。
运行效果
可以看到,非常丝滑,控制鼠标连击十分轻松,收放自如。
- 当按下 Ctrl + Shift + A 时候,进行 鼠标连击(键盘的组合键可以自定义)
- 当按下 Ctrl + Shift + Q 时候,进行 停止连击(键盘的组合键可以自定义)

总结✨✨
本文介绍了 ctypes模块 的基本使用,并且使用 ctypes 实现 鼠标连击 的操作,
最后结合前面的键盘监听 文章,实现了 收放自如 的 鼠标连击 功能。
本文总结了使用ctypes模块实现鼠标连击的操作。
- 首先,介绍了
ctypes模块的基本使用方法,它可以用来调用动态链接库中的函数; - 然后,使用
ctypes模块调用Windows API中的鼠标事件函数,实现了模拟鼠标按下和释放的功能; - 最后,结合之前的键盘监听文章,将鼠标连击的功能与键盘事件绑定,实现了根据按键触发连击的功能。最后,给出了一个完整的示例代码,演示了如何使用
ctypes模块和键盘监听功能实现一个灵活的鼠标连击器。
通过本文的学习,读者可以了解到如何使用ctypes模块实现鼠标连击,并结合键盘监听功能进行更高级的操作。这对于需要进行大量鼠标点击的自动化任务或游戏操作来说非常有用。读者可以根据自己的需求进一步扩展和优化代码,以满足实际应用场景的要求。
相关文章:
【使用Python编写游戏辅助工具】第三篇:鼠标连击器的实现
前言 这里是【使用Python编写游戏辅助工具】的第三篇:鼠标连击器的实现。本文主要介绍使用Python来实现鼠标连击功能。 鼠标连击是指在很短的时间内多次点击鼠标按钮,通常是鼠标左键。当触发鼠标连击时,鼠标按钮会迅速按下和释放多次…...
C++二分查找算法的应用:最小好进制
本文涉及的基础知识点 二分查找 题目 以字符串的形式给出 n , 以字符串的形式返回 n 的最小 好进制 。 如果 n 的 k(k>2) 进制数的所有数位全为1,则称 k(k>2) 是 n 的一个 好进制 。 示例 1: 输入:n “13” 输出:“3” …...
2022年12月 Python(三级)真题解析#中国电子学会#全国青少年软件编程等级考试
Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 列表L1中全是整数,小明想将其中所有奇数都增加1,偶数不变,于是编写了如下图所示的代…...
行业安卓主板-基于RK3568/3288/3588的AI视觉秤/云相框/点餐机/明厨亮灶行业解决方案(一)
AI视觉秤 单屏Al秤集成独立NPU,可达0.8Tops算力,令AI运算效率大幅提升,以实现生鲜商品快速准确识别,快速称重打印标签,降低生鲜门店运营成本,缓解高峰期称重排队拥堵的现象,提高称重效率&#…...
fo-dicom缺少DicomJpegLsLosslessCodec
VS2019,fo-dicom v4.0.8 using Dicom.Imaging.Codec; ... DicomJpegLsLosslessCodec //CS0103 当前上下文中不存在名称“DicomJpegLsLosslessCodec” 但官方文档的确存在该类的说明DicomJpegLsLosslessCodec 尝试:安装包fo-dicom.Codecs,注…...
跳跳狗小游戏
欢迎来到程序小院 跳跳狗 玩法:一直弹跳的狗狗,鼠标点击屏幕左右方向键进行弹跳,弹到不同物品会有不同的分数减扣,规定的时间3分钟内完成狗狗弹跳,快去跳跳狗吧^^。开始游戏https://www.ormcc.com/play/gameStart/198…...
CoDeSys系列-4、基于Ubuntu的codesys运行时扩展包搭建Profinet主从环境
CoDeSys系列-4、基于Ubuntu的codesys运行时扩展包搭建Profinet主从环境 文章目录 CoDeSys系列-4、基于Ubuntu的codesys运行时扩展包搭建Profinet主从环境一、前言二、资料收集三、Ubuntu18.04从安装到更换实时内核1、下载安装Ubuntu18.042、下载安装实时内核,解决编…...
shell_70.Linux调整谦让度
调整谦让度 1.nice 命令 (1)nice 命令允许在启动命令时设置其调度优先级。要想让命令以更低的优先级运行,只需用nice 命令的-n 选项指定新的优先级即可: $ nice -n 10 ./jobcontrol.sh > jobcontrol.out & [2] 16462 $ $ ps -p 16462 -o pid,…...
【jvm】虚拟机栈
目录 一、背景二、栈与堆三、声明周期四、作用五、特点(优点)六、可能出现的异常七、设置栈内存大小八、栈的存储单位九、栈运行原理十、栈帧的内部结构10.1 说明10.2 局部变量表10.3 操作数栈10.4 动态链接10.5 方法返回地址10.6 一些附加信息 十一、代…...
Flink SQL Over 聚合详解
Over 聚合定义(⽀持 Batch\Streaming):**特殊的滑动窗⼝聚合函数,拿 Over 聚合 与 窗⼝聚合 做对⽐。 窗⼝聚合:不在 group by 中的字段,不能直接在 select 中拿到 Over 聚合:能够保留原始字段…...
【鸿蒙软件开发】ArkUI之容器组件Counter(计数器组件)、Flex(弹性布局)
文章目录 前言一、Counter1.1 子组件1.2 接口1.3 属性1.4 事件 1.5 示例代码二、Flex弹性布局到底是什么意思? 2.1 权限列表2.2 子组件2.3 接口参数 2.4 示例代码示例代码1示例代码2 总结 前言 Counter容器组件:计数器组件,提供相应的增加或…...
PyTorch入门学习(十一):神经网络-线性层及其他层介绍
目录 一、简介 二、PyTorch 中的线性层 三、示例:使用线性层构建神经网络 四、常见的其他层 一、简介 神经网络是由多个层组成的,每一层都包含了一组权重和一个激活函数。每层的作用是将输入数据进行变换,从而最终生成输出。线性层是神经…...
农业水土环境与面源污染建模及对农业措施响应
目录 专题一 农业水土环境建模概述 专题二 ArcGIS入门 专题三 农业水土环境建模流程 专题四 DEM数据制备流程 专题五 土地利用数据制备流程 专题六 土壤数据制备流程 专题七 气象数据制备流程 专题八 农业措施数据制备流程 专题九 参数率定与结果验证 专题十 模型结…...
回归预测 | Matlab实现MPA-BP海洋捕食者算法优化BP神经网络多变量回归预测(多指标、多图)
回归预测 | Matlab实现MPA-BP海洋捕食者算法优化BP神经网络多变量回归预测(多指标、多图) 目录 回归预测 | Matlab实现MPA-BP海洋捕食者算法优化BP神经网络多变量回归预测(多指标、多图)效果一览基本介绍程序设计参考资料 效果一览…...
扫地机器人遇瓶颈?科沃斯、石头科技“突围”
曾经,扫地机器人行业也曾有过高光时刻,而如今,扫地机器人已然告别高增长阶段,增速开始放缓。据中怡康零售推总数据显示,2023年上半年,中国扫地机器人市场规模为63.6亿元人民币,同比下滑了0.6%&a…...
基于SSM的防疫信息登记系统设计与实现
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…...
VBA将字典按照item的值大小排序key
方法:利用数组交换位置 sub 字典排序() s 0 Dim arr(dic1.keys)将字典key和value存入一个数组中 For Each ke In dic1.keysarr(s) Array(ke, dic1(ke))s s 1 Next进行排序 For i LBound(arr) To UBound(arr) - 1For j i 1 To UBound(arr)If arr(i)(1) >…...
MySQL第四讲·如何正确设置主键?
你好,我是安然无虞。 文章目录 主键:如何正确设置主键?业务字段做主键自增字段做主键手动赋值字段做主键 主键总结 主键:如何正确设置主键? 前面我们在讲解存储的时候,有提到过主键,它可以唯一…...
K8S知识点(三)
(1)环境搭建-环境初始化 Centos的版本是有要求的必须是7.5或以上,否则安装出来的集群是有问题的Node节点可能加入不到集群中来 详细步骤 1.同时连接三台服务器:查看一下版本 是否正确 2.主机名解析,方便节点之间的…...
c语言刷题(9周)(6~10)
输入10个不等的整数创建数组a[10],在数组a中找是否存在整数t。若存在显示找到了及下标位置,若不存在显示error。 题干输入10个不等的整数创建数组a[10],在数组a中找是否存在整数t。若存在显示找到了及下标位置,若不存在显示error…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
