AutoHotkey 鼠标宏实战:快速写出第一个点击连招脚本
【免费下载链接】AutoHotkeyAutoHotkey - macro-creation and automation-oriented scripting utility for Windows.项目地址: https://gitcode.com/gh_mirrors/au/AutoHotkey
AutoHotkey 是一款面向 Windows 的免费开源脚本工具,它的鼠标宏能力可以按指定屏幕坐标模拟鼠标点击、移动和拖拽,把批量处理、固定顺序操作这类重复动作变成一键触发。
一组固定点击,一天重复几十次
这一节说明鼠标宏解决哪类问题。前提很明确:目标窗口布局固定、操作点位置不随时间变化。比如每次导出文件都要点右上角按钮、确认对话框、再点保存;或者游戏里技能槽固定在屏幕同一位置,需要在几百毫秒内按固定顺序点完。手动点击既容易漏也容易累。AutoHotkey 的做法是把这套序列写成脚本、绑定到一个功能键上,需要执行时按一次即可。
三个鼠标原语:点、移、拖
这一节快速过一遍可用的基础动作。AutoHotkey 把它们暴露为内置命令,函数声明见 source/keyboard_mouse.h:
MouseClick:在指定坐标点击,可指定按键、点击次数;MouseMove:把指针移到指定坐标;MouseClickDrag:在起点按下、移动到终点、再抬起,完成一次拖拽;- 辅助命令两个:
MouseGetPos读取当前指针坐标,PixelGetColor读取某坐标的像素颜色,可用于判断按钮状态是否变化。
多数宏需求用这三个原语就能覆盖,后文都是它们的组合。
原理拆解:脚本的点击如何到达窗口
这一节回答一个影响可靠性的问题:脚本"点"下去,不是真的在动鼠标。解释器把命令参数翻译成鼠标事件,通过 Windows 系统接口(SendInput 或 mouse_event)注入系统输入队列。调用链是:脚本命令先进入PerformMouse()做参数校验和分发(哪个键、要不要先移动、按下还是抬起),再落到底层的MouseClick()、MouseMove()发出事件,实现在 source/keyboard_mouse.cpp。
有三个细节值得知道:
- 坐标会被换算。Windows 的绝对鼠标坐标系是 0 到 65535,AutoHotkey 自动把屏幕坐标缩放映射过去。多显示器环境下绝对坐标以主显示器为基准,经常点到副屏时可能要换发送方式。
- 按下和抬起是两个独立事件。一次"点击"等于"按下 + 抬起",源码在两者之间刻意插入了鼠标延迟(
SetMouseDelay可调),这就是"点得太快没生效"的根源。 - 左右键语义跟随系统设置。若在鼠标设置里启用了"交换主要与次要按键",脚本里的 Left 会被自动换算成物理右键,不会点错。
知道这三点,多数"点不中"的问题就能定位。
分步实操:坐标获取与点击序列
如何拿到技能图标坐标
先取目标点坐标,不要靠肉眼估。一个常用办法是做一个跟随指针的浮动提示:
#Persistent ; 浮动提示跟随指针,每 150ms 刷新一次,按 Esc 退出 SetTimer, CoordTip, 150 return CoordTip: MouseGetPos, px, py ToolTip, (%px%, %py%) return Esc::ExitApp运行后把指针悬停到要点的按钮或技能槽上,记下显示的数字即可。
如何拼装点击序列
拿到坐标后,把序列绑定到功能键。用Sleep控制动作间隔,间隔要略大于目标程序的实际反应时间,宁长勿短:
; 按 F2:依次点三个技能槽,最后一个位置双击右键 F2:: MouseClick, Left, 812, 904, 1 Sleep, 180 MouseClick, Left, 864, 904, 1 Sleep, 220 MouseClick, Right, 700, 512, 2 return如何区分按下与抬起
"按住不放再松开"这类操作(拉出范围条、长按确认),用 D/U 参数把一次点击拆成两半:
; 左键在当前指针位置按住 600ms 再松开 MouseClick, Left, , , 1, 0, D Sleep, 600 MouseClick, Left, , , 1, 0, UD(down)和 U(up)省略坐标时,动作发生在指针当前位置,不会移动指针。
高频坑位与规避办法
这一节收集写鼠标宏时最常踩的四个坑:
- 多屏下点偏。绝对坐标换算以主显示器为基准,副屏目标点容易偏。可把发送方式切到
SendPlay(日志回放模式),或改用SetCursorPos直接定位。 - 游戏对点击无反应。部分游戏通过 DirectInput/Raw Input 直接读输入,不走系统事件队列,脚本注入的事件对它不可见。遇到这种情况先确认目标程序是否原始输入,是的话宏方案就不成立。
- 动作过快导致窗口不认。加大
Sleep间隔,或用SetMouseDelay提高按下与抬起之间的内部延迟,不要追求极限速度。 - 把连点写成长按。
MouseClick的第 4 个参数是点击次数(1 单击、2 双击);"按住"必须拆成 D/U 两条命令,混用会导致行为不符预期。
还能用在哪里,以及接下来的清单
🖱️ 鼠标宏不限于游戏,任何"固定位置 + 固定顺序"的场景都适用:批量导出流程、表单固定位置勾选、配合PixelGetColor做条件判断后再点击(读色实现见 source/lib/pixel.cpp)。
接下来可以按顺序尝试:
- 用
MouseClickDrag加MouseMove完成"框选区域再点击"这类组合操作; - 在连招脚本里加入
PixelGetColor,实现"满足颜色条件才点击"; - 把不同序列封装成函数,绑定到不同功能键复用;
- 顺着 source/keyboard_mouse.cpp 读一遍按下/抬起事件如何被逐条组装和发送。
最后提醒:在游戏环境中使用鼠标宏,需遵守该游戏的用户协议与平台规则,竞技和赛事场景不建议使用自动化操作;办公场景中注意别把坐标指到"删除""付款"这类危险按钮上。
【免费下载链接】AutoHotkeyAutoHotkey - macro-creation and automation-oriented scripting utility for Windows.项目地址: https://gitcode.com/gh_mirrors/au/AutoHotkey
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考