前言
这里是【使用Python编写游戏辅助工具】的第三篇:鼠标连击器的实现。本文主要介绍使用
Python
来实现鼠标连击功能。
鼠标连击是指在很短的时间内多次点击鼠标按钮,通常是鼠标左键。当触发鼠标连击时,鼠标按钮会迅速按下和释放多次,产生连续的点击效果。
在这里鼠标连击的主要用途是:
- 帮助我们进行鼠标点击,疯狂连击;
- 例如在射击游戏中连续开火,如果点击就可以攻击怪物,那就可以持续不断的高频次地攻击怪物;
- 通过鼠标连击,可以快速执行多个动作,提高操作效率。
文章脉络概述
本文的流程和功能如下图所示:
-
结合上篇文章的
键盘监听
来实现一个收放自如的鼠标连击
功能; -
通过键盘监听事件去驱动一些操作(
键盘监听
功能主要配合后面的鼠标连击
使用);- 当按下 Ctrl + Shift + A 时候,进行 鼠标连击(键盘的组合键可以自定义)
- 当按下 Ctrl + Shift + Q 时候,进行 停止连击(键盘的组合键可以自定义)
鼠标连击通常用于游戏或某些应用程序中的快速操作,例如在射击游戏中连续开火。通过鼠标连击,可以快速执行多个动作,提高操作效率。
系列文章脉络
系列文章内容大体如下,后续可能会更新新的文章。
知识点📖📖
库和模块 | 描述 |
---|---|
ctypes | 用于在Python中调用动态链接库(DLL)和共享库的外部函数(这里用于鼠标点击) |
据官网介绍,ctypes
是 Python 的外部函数库。它提供了与 C 兼容的数据类型,并允许调用 DLL 或共享库中的函数。可使用该模块以纯 Python 形式对这些库进行封装。
关于调用 ctypes
函数的步骤(具体的操作可以查阅官方文档
):
- 首先,导入
ctypes
模块。 - 定义函数的参数类型和返回值类型,可以通过
argtypes
和restype
属性进行设置。 - 使用
ctypes.windll
访问 Windows 动态链接库,并获取所需的函数。 - 调用函数并传递相应的参数。
这个模块就可以很好的实现本文的主题。
鼠标连击 实现
在
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_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-8
import 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_uint
flag = False
# 定义鼠标点击函数
def click_mouse():
"""模拟鼠标点击事件"""
while flag:
# 创建一个鼠标左键按下事件
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)
def start_keyboard_listener():
"""
开始键盘监听的回调函数
"""
global flag
flag = True
print("Ctrl+Shift+A pressed")
threading.Thread(target=click_mouse).start()
def stop_keyboard_listener():
"""
停止键盘监听的回调函数
"""
global flag
flag = False
print("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
模块实现鼠标连击,并结合键盘监听功能进行更高级的操作。这对于需要进行大量鼠标点击的自动化任务或游戏操作来说非常有用。读者可以根据自己的需求进一步扩展和优化代码,以满足实际应用场景的要求。