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

本文主要是介绍【使用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模块实现鼠标连击,并结合键盘监听功能进行更高级的操作。这对于需要进行大量鼠标点击的自动化任务或游戏操作来说非常有用。读者可以根据自己的需求进一步扩展和优化代码,以满足实际应用场景的要求。

这篇关于【使用Python编写游戏辅助工具】第三篇:鼠标连击器的实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/336185

相关文章

使用DeepSeek API 结合VSCode提升开发效率

《使用DeepSeekAPI结合VSCode提升开发效率》:本文主要介绍DeepSeekAPI与VisualStudioCode(VSCode)结合使用,以提升软件开发效率,具有一定的参考价值... 目录引言准备工作安装必要的 VSCode 扩展配置 DeepSeek API1. 创建 API 请求文件2.

使用TomCat,service输出台出现乱码的解决

《使用TomCat,service输出台出现乱码的解决》本文介绍了解决Tomcat服务输出台中文乱码问题的两种方法,第一种方法是修改`logging.properties`文件中的`prefix`和`... 目录使用TomCat,service输出台出现乱码问题1解决方案问题2解决方案总结使用TomCat,

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

Java中使用Java Mail实现邮件服务功能示例

《Java中使用JavaMail实现邮件服务功能示例》:本文主要介绍Java中使用JavaMail实现邮件服务功能的相关资料,文章还提供了一个发送邮件的示例代码,包括创建参数类、邮件类和执行结... 目录前言一、历史背景二编程、pom依赖三、API说明(一)Session (会话)(二)Message编程客

Java中List转Map的几种具体实现方式和特点

《Java中List转Map的几种具体实现方式和特点》:本文主要介绍几种常用的List转Map的方式,包括使用for循环遍历、Java8StreamAPI、ApacheCommonsCollect... 目录前言1、使用for循环遍历:2、Java8 Stream API:3、Apache Commons

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

Python判断for循环最后一次的6种方法

《Python判断for循环最后一次的6种方法》在Python中,通常我们不会直接判断for循环是否正在执行最后一次迭代,因为Python的for循环是基于可迭代对象的,它不知道也不关心迭代的内部状态... 目录1.使用enuhttp://www.chinasem.cnmerate()和len()来判断for

C#提取PDF表单数据的实现流程

《C#提取PDF表单数据的实现流程》PDF表单是一种常见的数据收集工具,广泛应用于调查问卷、业务合同等场景,凭借出色的跨平台兼容性和标准化特点,PDF表单在各行各业中得到了广泛应用,本文将探讨如何使用... 目录引言使用工具C# 提取多个PDF表单域的数据C# 提取特定PDF表单域的数据引言PDF表单是一

使用Python实现高效的端口扫描器

《使用Python实现高效的端口扫描器》在网络安全领域,端口扫描是一项基本而重要的技能,通过端口扫描,可以发现目标主机上开放的服务和端口,这对于安全评估、渗透测试等有着不可忽视的作用,本文将介绍如何使... 目录1. 端口扫描的基本原理2. 使用python实现端口扫描2.1 安装必要的库2.2 编写端口扫

PyCharm接入DeepSeek实现AI编程的操作流程

《PyCharm接入DeepSeek实现AI编程的操作流程》DeepSeek是一家专注于人工智能技术研发的公司,致力于开发高性能、低成本的AI模型,接下来,我们把DeepSeek接入到PyCharm中... 目录引言效果演示创建API key在PyCharm中下载Continue插件配置Continue引言