【使用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

相关文章

Nginx中配置使用非默认80端口进行服务的完整指南

《Nginx中配置使用非默认80端口进行服务的完整指南》在实际生产环境中,我们经常需要将Nginx配置在其他端口上运行,本文将详细介绍如何在Nginx中配置使用非默认端口进行服务,希望对大家有所帮助... 目录一、为什么需要使用非默认端口二、配置Nginx使用非默认端口的基本方法2.1 修改listen指令

Redis实现分布式锁全过程

《Redis实现分布式锁全过程》文章介绍Redis实现分布式锁的方法,包括使用SETNX和EXPIRE命令确保互斥性与防死锁,Redisson客户端提供的便捷接口,以及Redlock算法通过多节点共识... 目录Redis实现分布式锁1. 分布式锁的基本原理2. 使用 Redis 实现分布式锁2.1 获取锁

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

从基础到进阶详解Python条件判断的实用指南

《从基础到进阶详解Python条件判断的实用指南》本文将通过15个实战案例,带你大家掌握条件判断的核心技巧,并从基础语法到高级应用一网打尽,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录​引言:条件判断为何如此重要一、基础语法:三行代码构建决策系统二、多条件分支:elif的魔法三、

Python WebSockets 库从基础到实战使用举例

《PythonWebSockets库从基础到实战使用举例》WebSocket是一种全双工、持久化的网络通信协议,适用于需要低延迟的应用,如实时聊天、股票行情推送、在线协作、多人游戏等,本文给大家介... 目录1. 引言2. 为什么使用 WebSocket?3. 安装 WebSockets 库4. 使用 We

Linux实现查看某一端口是否开放

《Linux实现查看某一端口是否开放》文章介绍了三种检查端口6379是否开放的方法:通过lsof查看进程占用,用netstat区分TCP/UDP监听状态,以及用telnet测试远程连接可达性... 目录1、使用lsof 命令来查看端口是否开放2、使用netstat 命令来查看端口是否开放3、使用telnet

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py

Java使用正则提取字符串中的内容的详细步骤

《Java使用正则提取字符串中的内容的详细步骤》:本文主要介绍Java中使用正则表达式提取字符串内容的方法,通过Pattern和Matcher类实现,涵盖编译正则、查找匹配、分组捕获、数字与邮箱提... 目录1. 基础流程2. 关键方法说明3. 常见场景示例场景1:提取所有数字场景2:提取邮箱地址4. 高级

使用SpringBoot+InfluxDB实现高效数据存储与查询

《使用SpringBoot+InfluxDB实现高效数据存储与查询》InfluxDB是一个开源的时间序列数据库,特别适合处理带有时间戳的监控数据、指标数据等,下面详细介绍如何在SpringBoot项目... 目录1、项目介绍2、 InfluxDB 介绍3、Spring Boot 配置 InfluxDB4、I

基于Java和FFmpeg实现视频压缩和剪辑功能

《基于Java和FFmpeg实现视频压缩和剪辑功能》在视频处理开发中,压缩和剪辑是常见的需求,本文将介绍如何使用Java结合FFmpeg实现视频压缩和剪辑功能,同时去除数据库操作,仅专注于视频处理,需... 目录引言1. 环境准备1.1 项目依赖1.2 安装 FFmpeg2. 视频压缩功能实现2.1 主要功