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

image.png

前言

这里是【使用Python编写游戏辅助工具】的第三篇:鼠标连击器的实现。本文主要介绍使用Python来实现鼠标连击功能。

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

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

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

文章脉络概述

本文的流程和功能如下图所示:

  • 结合上篇文章的键盘监听 来实现一个收放自如的鼠标连击功能;

  • 通过键盘监听事件去驱动一些操作(键盘监听功能主要配合后面的鼠标连击使用);

    • 当按下 Ctrl + Shift + A 时候,进行 鼠标连击(键盘的组合键可以自定义)
    • 当按下 Ctrl + Shift + Q 时候,进行 停止连击(键盘的组合键可以自定义)
辅助工具
鼠标连击
键盘监听
开始连击
Ctrl + Shift + A
Ctrl + Shift + Q
停止连击

鼠标连击通常用于游戏或某些应用程序中的快速操作,例如在射击游戏中连续开火。通过鼠标连击,可以快速执行多个动作,提高操作效率。

系列文章脉络

系列文章内容大体如下,后续可能会更新新的文章。

  • 点击直达:【使用Python编写游戏辅助工具】第一篇:概述

  • 点击直达:【使用Python编写游戏辅助工具】第二篇:键盘监听的应用

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

  • 点击直达:【使用Python编写游戏辅助工具】第四篇:Windows窗口操作

  • 点击直达:【使用Python编写游戏辅助工具】第五篇:打造交互式游戏工具界面:PySide6/PyQT高效构建GUI工具

知识点📖📖

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

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

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

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

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

鼠标连击 实现

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_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

键盘监听 启动 鼠标连击

在这一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” 时,该函数被触发。它将设置一个全局变量 flagTrue,然后创建一个新的线程,并在该线程中调用 click_mouse() 函数,从而实现鼠标点击的连击效果。

  • stop_keyboard_listener() 函数是停止键盘监听的回调函数。当按下热键 “Ctrl+Shift+Q” 时,该函数被触发。它将设置全局变量 flagFalse,从而停止鼠标点击的连击效果。

  • __main__ 部分,通过 keyboard.add_hotkey 注册了两个热键,分别对应开始和停止键盘监听的回调函数。然后调用 keyboard.wait() 进入监听状态,等待热键的触发。

总体来说,这份代码实现了通过热键控制鼠标点击的连击效果。按下 “Ctrl+Shift+A” 启动连击,按下 “Ctrl+Shift+Q” 停止连击。

运行效果

可以看到,非常丝滑,控制鼠标连击十分轻松,收放自如。

  • 当按下 Ctrl + Shift + A 时候,进行 鼠标连击(键盘的组合键可以自定义)
  • 当按下 Ctrl + Shift + Q 时候,进行 停止连击(键盘的组合键可以自定义)

键盘监听鼠标连击.gif

总结✨✨

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

最后结合前面的键盘监听 文章,实现了 收放自如 的 鼠标连击 功能。

本文总结了使用ctypes模块实现鼠标连击的操作。

  • 首先,介绍了ctypes模块的基本使用方法,它可以用来调用动态链接库中的函数;
  • 然后,使用ctypes模块调用Windows API中的鼠标事件函数,实现了模拟鼠标按下和释放的功能;
  • 最后,结合之前的键盘监听文章,将鼠标连击的功能与键盘事件绑定,实现了根据按键触发连击的功能。最后,给出了一个完整的示例代码,演示了如何使用ctypes模块和键盘监听功能实现一个灵活的鼠标连击器。

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

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

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

相关文章

双十一快递“当天达”?宏电助力物流分拣系统高效运行

​众所周知,每年双11都是快递业务的高峰期,是对各大物流企业运输能力的一次大考。为了持续提升快递配送的速度,自动化物流仓储建设的速度也在不断的加快,而在一个完整的自动化物流仓储系统中,输送分拣设备是物流自动化…

MySql优化经验分享

一条sql的具体执行过程 连接 我们怎么查看MySQL当前有多少个连接? 可以用show status命令,模糊匹配Thread, Show global status like "Thread%" show global variables like wait timeout;—非交互式超时时间,如JDBC…

c++ | 字符串与指针的恩断情仇

我想&#xff0c;c/c中难的不是指针&#xff0c;而是其中的变化&#xff0c;尤其是思维的转变。很多东西 就是容易掉进陷阱。好在&#xff0c;你我都是善于思考的码农&#xff01; 大致情况是这样的&#xff0c;底层<–>c语言<–>c<–>应用 而数据的传输的最…

【MongoDB】Windows 安装MongoDB 6.0

一、下载安装包 安装包下载地址https://www.mongodb.com/try/download/community这里我选择的是 二、解压并安装 1、解压 这里我将压缩包解压到了D盘&#xff0c;并重命名成了mongodb&#xff0c;解压后的目录如下&#xff1a; 2、创建配置文件 在D:\mongodb下新建conf目录…

【触想智能】4U触摸工控机具有哪些优势?

工控机也叫工控主机&#xff0c;和我们常见的普通电脑主机是一样的&#xff0c;都是由CPU、主板、内存、硬盘、电源以及机箱组成的。 工控机有很多分类&#xff0c;有无风扇工控机、嵌入式工控机、上架式工控机、4U触摸工控机等。上架式工控机在市场上是比较受欢迎的&#xff0…

Django实战项目-学习任务系统-发送邮件通知

接着上期代码内容&#xff0c;继续完善优化系统功能。 本次增加发送邮件通知功能&#xff0c;学习任务系统发布的任务&#xff0c;需要及时通知到学生用户知晓。 由于目前智能手机普及&#xff0c;人人都离不开手机&#xff0c;所以手机端接收通知信息更加及时有效。 其中微信…

superagent 库

superagent 是一个流行的 JavaScript 库&#xff0c;用于在浏览器和 Node.js 环境中进行 HTTP 请求。它提供了简洁的 API&#xff0c;使得发送异步请求变得非常容易。 以下是一个使用 superagent 的简单示例&#xff1a; 在浏览器环境中&#xff1a; // 发送 GET 请求 supe…

自定义的卷积神经网络模型CNN,对图片进行分类并使用图片进行测试模型-适合入门,从模型到训练再到测试,开源项目

自定义的卷积神经网络模型CNN&#xff0c;对图片进行分类并使用图片进行测试模型-适合入门&#xff0c;从模型到训练再到测试&#xff1a;开源项目 开源项目完整代码及基础教程&#xff1a; https://mbd.pub/o/bread/ZZWclp5x CNN模型&#xff1a; 1.导入必要的库和模块&…

PP-Matting:trimap free的高精度自然图像抠图

论文&#xff1a;https://arxiv.org/abs/2204.09433 代码&#xff1a;https://github.com/PaddlePaddle/PaddleSeg 1、动机 在自然图像抠图领域&#xff0c;大多数方法都是基于Trimap来做抠图&#xff0c;这种trimap-based的方式在抠图时还需要用户绘制一个trimap作为模型输入&…

SpringBoot--Web开发篇:含enjoy模板引擎整合,SpringBoot整合springMVC;及上传文件至七牛云;restFul

SpringBoot的Web开发 官网学习&#xff1a; 进入spring官网 --> projects --> SpringBoot --> LEARN --> Reference Doc. --> Web --> 就能看到上述页面 静态资源映射规则 官方文档 总结&#xff1a; 只要是静态资源&#xff0c;放在类路径下&#xff1…

整理笔记——0欧电阻、电感、磁珠

设计电路时&#xff0c;经常用到0欧电阻、电感、磁珠&#xff0c;这三个基础电子原件万用表量都是“短路”&#xff0c;这三者之间有什么区别&#xff1f;什么情况下用什么原件&#xff1f; 一、0欧电阻 0欧电阻&#xff0c;并不是指元件的电阻值为0&#xff0c;而是电阻值很小…

使用免费 FlaskAPI 部署 YOLOv8

目标检测和实例分割是计算机视觉中关键的任务&#xff0c;使计算机能够在图像和视频中识别和定位物体。YOLOv8是一种先进的、实时的目标检测系统&#xff0c;因其速度和准确性而备受欢迎。 Flask是一个轻量级的Python Web框架&#xff0c;简化了Web应用程序的开发。通过结合Fla…

SpringBoot 日志

一、概述 日志是程序的重要组成部分&#xff0c;程序报错了&#xff0c;我们可以通过查看日志信息排除和定位问题。 二、日志格式 在启动 SpringBoot 项目时&#xff0c;控制台中默认会打印一些日志&#xff0c;下面我们截取一段日志信息&#xff0c;分析一下日志的格式&…

【蓝桥每日一题]-二分类型(保姆级教程 篇3) #路标设置 #跳石头

今天接着讲二分题型 目录 题目&#xff1a;路标设置 思路&#xff1a; 题目&#xff1a;跳石头 思路&#xff1a; 题目&#xff1a;路标设置 思路&#xff1a; 求&#xff1a;放n个路标后的最小空旷指数 二分查找&#xff1a;对空旷指数进行二分 二分依据: 该空旷指数下放…

支付宝本地生活团购服务商如何申请?两个方法教给你

支付开宝的本地生活来了&#xff01;按支付宝财大气粗的做法&#xff0c;它一旦要推什么项目&#xff0c;那自然会在前期疯狂洒钱&#xff0c;以求通过这种模式快速占领市场。 所以&#xff0c;这次支付宝要推本地生活项目&#xff0c;这一贯做法自然得跟上&#xff0c;只是这…

飞致云及其旗下1Panel项目进入2023年第三季度最具成长性开源初创榜单

2023年10月26日&#xff0c;知名风险投资机构Runa Capital发布2023年第三季度ROSS指数&#xff08;Runa Open Source Startup Index&#xff09;。ROSS指数按季度汇总并公布在代码托管平台GitHub上年化增长率&#xff08;AGR&#xff09;排名前二十位的开源初创公司和开源项目。…

win10pycharm和anaconda安装和环境配置教程

windows10 64位操作系统下系统运行环境安装配置说明 下载和安装Anaconda&#xff0c;链接https://www.anaconda.com/download 下载完后&#xff0c;双击exe文件 将anaconda自动弹出的窗口全部关掉即可&#xff0c;然后配置高级系统变量 根据自己的路径&#xff0c;配置…

基于Google Earth Engine云平台构建的多源遥感数据森林地上生物量AGB估算模型含生物量模型应用APP

最近我在 International Journal of Digital Earth &#xff08;《国际数字地球学报》&#xff09;发表了一篇森林生物量模型构建的文章&#xff1a;Evaluation of machine learning methods and multi-source remote sensing data combinations to construct forest above-gro…

欧科云链研究院:如何降低Web3风险,提升虚拟资产创新的安全合规

在香港Web3.0行业&#xff0c;技术推动了虚拟资产投资市场的快速增长&#xff0c;但另一方面&#xff0c;JPEX诈骗案等行业风险事件也接连发生&#xff0c;为Web3行业发展提供了重要警示。在近期的香港立法会施政报告答问会上&#xff0c;行政长官李家超表示&#xff0c;与诈骗…

图像特征Vol.1:计算机视觉特征度量|第二弹:【统计区域度量】

目录 一、前言二、统计区域度量2.1&#xff1a;图像矩特征2.1.1&#xff1a;原始矩/几何矩2.1.2&#xff1a;中心距2.1.3&#xff1a;归一化的中心矩2.1.4&#xff1a;不变矩——Hu矩2.1.5&#xff1a;OpenCv实现矩特征及其应用 2.2&#xff1a;点度量特征2.3&#xff1a;全局直…