ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

AutoHotkey 鼠标自动化快速上手:录下第一组操作,再一键回放

AutoHotkey 鼠标自动化快速上手:录下第一组操作,再一键回放

AutoHotkey 鼠标自动化快速上手:录下第一组操作,再一键回放

【免费下载链接】AutoHotkeyAutoHotkey - macro-creation and automation-oriented scripting utility for Windows.项目地址: https://gitcode.com/gh_mirrors/au/AutoHotkey

AutoHotkey 是一款面向 Windows 的免费开源自动化脚本工具。用它的鼠标自动化能力,你可以把一段重复的鼠标操作"录"下来,再按节奏回放,省掉重复点击的力气——从表单录入到软件流程,几十行脚本就能搞定。这篇文章带你在真实源码的基础上,从零搭出"录制 → 回放 → 热键触发"的完整链路。

两个命令,先让鼠标动起来

这一节解决最基本的问题:怎么让鼠标按你的意思移动、点击。

所有鼠标动作的原型都在 source/keyboard_mouse.cpp 里。你只需要记住三件事:

  • MouseMove, X, Y, Speed:把光标移到 (X, Y),Speed 越大移动越慢,0 表示瞬间到位。
  • MouseClick, 按钮, X, Y, 次数:默认左键单击一次;次数填 2 就是双击,按钮还能换成Right、Wheel等。
  • MouseClickDrag:按住鼠标键从起点拖到终点,录制拖拽流程时用它。

下面这段脚本把光标移到 (100, 200) 并双击:

MouseMove, 100, 200, 10 MouseClick, Left, 100, 200, 2, 10

想"按住不松"或"只松键"时,MouseClick还支持Down/Up选项,组合起来就能模拟"长按"这类动作。

三种发送模式怎么选

鼠标点下去了,事件怎么送进 Windows?AutoHotkey 提供三种"送信方式",用SendMode命令切换,默认是 SendInput。这里的"模式"指模拟输入被系统接收的底层机制,不同机制的速度和兼容性不同:

模式机制一句话适用场景
SendInput直接向系统投递输入事件,速度快绝大多数办公软件、日常自动化
SendPlay通过回放钩子逐条重放,更像真人逐次操作个别只认"真实手感"的程序,但整体更慢
SendEvent逐条发送并动态适应当时状态,兼容性最强老旧软件、行为诡异的特殊环境

源码里这三者对应枚举SM_INPUT/SM_PLAY/SM_EVENT,定义在 source/defines.h。还有一个有意思的细节:如果系统上存在其他钩子导致 SendInput 不可靠,脚本会自动降级到SendEvent,见 source/keyboard_mouse.cpp 中SendKeys的降级逻辑。

选择原则:日常先用默认的 SendInput,遇到不听话的软件再依次试 SendPlay、SendEvent。切换后建议先小规模测试一轮再上正式流程。

第一次录制操作:把坐标和时间落进文件

这一节带你写出最小可用的录制脚本,思路只有一个:记下每一步的坐标 + 发生时间。

下面这个循环每 50 毫秒把光标位置和时间戳写进recording.txt,按 Esc 停止:

Loop { MouseGetPos, x, y FileAppend, %A_TickCount% %x% %y%`n, recording.txt Sleep, 50 } Esc::ExitApp

A_TickCount是内置变量,表示自系统启动以来的毫秒数,拿它当"秒表"就够用了。MouseGetPos的实现可以在 source/script2.cpp 里找到。

回放就是反过来做:逐行读文件,把光标移回记录的位置。下面这段在回放时还原了操作的节奏——相邻两条记录的时间差,就是Sleep的时长:

FileRead, content, recording.txt Loop, Parse, content, `n { StringSplit, p, A_LoopField, %A_Space% Sleep, p1 - LastTime LastTime := p1 MouseMove, p2, p3, 10 }

这样录下的不是"一堆坐标",而是"一段有快慢的操作录像"。⏱️

热键触发与窗口条件执行

这一节解决两个体验问题:怎么随时启动回放,以及怎么避免热键到处乱触发。

  • 组合键启动:^!r代表 Ctrl+Alt+R(^=Ctrl,!=Alt)。把它绑成一个热键,回放脚本随时待命。
  • 只在目标窗口生效:#IfWinActive, 窗口标题声明之后的热键,仅当该窗口处于激活状态时才响应;再写一行不带参数的#IfWinActive即可取消限制。

这段示例只在记事本激活时,用 F1 触发回放:

#IfWinActive, ahk_exe notepad.exe F1:: Run, replay.ahk return #IfWinActive

热键的解析与执行逻辑集中在 source/hotkey.cpp,#IfWinActive一族的处理在 source/script2.cpp 中。

封装、排错与提速

最后集中处理三类最常被卡住的问题:重复代码越写越长、动作被拦、跑得慢。

  • 重复操作封装成函数。"移动 + 点击"出现三次以上,就该提成函数了:
ClickAt(x, y) { MouseMove, x, y, 10 MouseClick, Left, x, y } ClickAt(500, 300)
  • 点偏了。多显示器或 DPI 缩放时,绝对坐标容易落点不准;先确认窗口分辨率和缩放比例,必要时用R选项改走相对坐标,或者在点击前用WinActivate把目标窗口拉回已知位置。
  • 被游戏 / 安全软件拦截。⚠️ 换成SendMode Play试试;或者执行期间用BlockInput On屏蔽真实输入,结束后BlockInput Off恢复。但请注意:游戏反作弊通常直接禁止一切模拟输入,脚本不是万能钥匙。
  • 跑得慢。发送侧用 SendInput 比逐条 hook 快得多(源码注释里就强调它"明显更快");回放循环里Sleep别给个位数毫秒,否则 CPU 空转,10~50 毫秒通常足够平滑。

状态位方面,g_BlockInput、g_BlockMouseMove等全局开关定义在 source/globaldata.cpp,对应BlockInput命令的行为。

源码对照速查

  • 鼠标核心命令与发送模式实现:source/keyboard_mouse.cpp
  • 热键定义与执行:source/hotkey.cpp
  • 输入阻塞与鼠标状态:source/globaldata.cpp
  • 模式枚举定义:source/defines.h

下一步可以做什么

  • 把「录制 → 回放 → 热键触发」完整跑一遍,录一段你自己每天的重复操作
  • 在回放循环里加一行条件判断(如先检查目标窗口是否激活),让回放变成"智能回放"
  • 用MouseClickDrag把拖拽类流程也纳入录制范围
  • 把常用鼠标组合封装成自己的小函数库,之后所有脚本直接调用

【免费下载链接】AutoHotkeyAutoHotkey - macro-creation and automation-oriented scripting utility for Windows.项目地址: https://gitcode.com/gh_mirrors/au/AutoHotkey

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

返回列表