简介:这份资源是面向Windows普通用户与脚本入门者的AutoHotKey中文版合集,围绕AHK快捷键与自动化操作展开,帮助零基础读者用简单脚本简化重复性工作,例如修改系统快捷键、模拟鼠标键盘按键等。压缩包共104个文件,约4.41MB,以45个ahk脚本为主体,辅以txt说明、exe工具、chm帮助文档、properties配置及少量dll、ini、xml等支撑文件,并附编辑器与AHK快餐店.chm,收录帮助文件中的全部示例,方便边查边练。已有309人学习下载。资源价值在于提供可直接运行和修改的脚本范例,覆盖AltTab、秒表、屏幕键盘等实用场景,同时包含为MED、UltraEdit、ConTEXT、PSPad、TextPad、jEdit等编辑器安装语法高亮与智能提示的脚本,便于读者搭建顺手的编写环境,在模仿中理解AHK语法与自动化思路。
1. AutoHotKey中文版:把重复操作压成一行热键的桌面自动化方案
每天在十几个窗口之间反复切换、复制粘贴同一串内容、手动填写格式固定的表单,这类操作单次不过几秒,累积起来却能吃掉一整个下午。AutoHotKey 就是冲着这类场景来的:一个 Windows 平台上的开源脚本工具,用几行配置把键盘鼠标的重复动作绑定成热键,按一下就自动跑完。所谓「AutoHotKey中文版」,指的并不是某个官方分支,而是围绕中文使用场景形成的落地方式——中文注释、中文输入法兼容、中文界面控件的识别与操作,以及中文社区里流传的脚本模板。它适合每天有大量重复录入、窗口切换、批量改文件名的人,也适合想给常用软件补一层快捷键的普通用户。上手门槛比想象中低,但中文环境下有几个坑必须先知道,否则脚本会以各种玄学方式失效。
2. 先跑通第一个热键:安装、编码与最小脚本
2.1 选版本与安装路径里的中文陷阱
AutoHotKey 目前主流是 v1 和 v2 两条线,语法差异不小。v1 的存量脚本多、中文社区示例几乎都是 v1 写法;v2 语法更严格、表达式更清晰,但老脚本不能直接跑。新手如果只是想快速抄作业,建议先装 v1.1 系列,等熟悉了再考虑迁移。安装时有一个容易被忽略的点:安装路径不要带中文和空格。虽然现代版本对中文路径的兼容性已经好了很多,但部分脚本在调用外部程序、读取相对路径时仍会因为路径里的中文字符出现乱码或找不到文件。默认装到C:\Program Files\AutoHotkey就行,别图省事装到「D:\我的工具\自动化」这种目录下。
安装完成后,右键桌面空白处会多出「新建 AutoHotKey Script」的选项,新建出来的文件是.ahk后缀。这里要处理第二个中文相关的坑:文件编码。用系统自带记事本保存.ahk时,默认可能是 UTF-8 带 BOM 或 GBK,不同编辑器行为不一致。脚本里一旦有中文注释或中文字符串,编码不对就会导致脚本报错或输出乱码。稳妥做法是用 VS Code 或 Notepad++ 打开,把编码统一设成「UTF-8 with BOM」,v1 对这个编码的识别最稳定。
2.2 一个能直接抄的最小脚本
下面这段脚本实现三件事:按Ctrl+Alt+N弹出一个输入框,把输入的内容自动粘贴到当前窗口;按Ctrl+Alt+T把当前时间以固定格式打出来;按Ctrl+Alt+Q退出脚本。把它存成demo.ahk,双击运行即可。
; 中文注释:演示三个常用热键 ; 编码必须为 UTF-8 with BOM,否则中文会乱码 ; Ctrl+Alt+N:弹出输入框,把内容粘贴到当前光标处 ^!n:: InputBox, userInput, 快速输入, 请输入要粘贴的内容,, 300, 130 if (ErrorLevel = 0 && userInput != "") { SendInput, %userInput% } return ; Ctrl+Alt+T:输出当前时间,格式 2025-01-01 09:30:00 ^!t:: FormatTime, nowTime,, yyyy-MM-dd HH:mm:ss SendInput, %nowTime% return ; Ctrl+Alt+Q:退出脚本 ^!q:: ExitApp return逻辑说明:^!n::里的^代表 Ctrl,!代表 Alt,n是字母键,组合起来就是热键定义。InputBox是内置命令,参数依次是变量名、窗口标题、提示文字、选项、宽度、高度。ErrorLevel为 0 表示用户点了确定,非 0 表示取消。SendInput是推荐的发送方式,比老的Send更快更可靠,尤其在中文输入法激活状态下差异明显。FormatTime的第二个参数留空表示取当前时间,第三个参数是格式串。
参数说明:SendInput后面跟%变量名%是 v1 的变量引用写法,v2 里改成直接写变量名不加百分号。InputBox的宽度高度单位是像素,太小会导致中文提示被截断。热键里的字母不区分大小写,但建议统一用小写,避免和 Shift 组合混淆。
2.3 中文输入法下的发送失效与规避
很多人第一次写脚本就翻车在这里:脚本用SendInput发送英文字符串没问题,一旦发送中文,要么只出来拼音,要么干脆没反应。原因是SendInput模拟的是键盘按键,而中文输入法处于激活状态时,按键会先被输入法拦截。解决办法有两个:一是发送前临时切换输入法状态,用SendInput, {Text}要发送的中文这种文本模式,{Text}前缀会绕过输入法的按键拦截,直接把字符串作为文本注入;二是发送前用SendInput, {Ctrl down}{Space}{Ctrl up}切到英文再切回来,但这种方式在不同输入法下行为不一致,不推荐。
更稳的写法是把所有中文发送都改成文本模式:
; 推荐:用 {Text} 模式发送中文,绕过输入法拦截 ^!1:: SendInput, {Text}这是一段中文测试内容 return注意{Text}模式不支持发送特殊按键,比如回车、Tab,需要单独用{Enter}、{Tab}补在后面。这个细节在批量填表场景里很关键,否则内容发出去了但不会自动跳到下一个输入框。
3. 窗口与控件操作:让脚本认得出中文界面
3.1 用 Window Spy 抓取中文窗口信息
AutoHotKey 安装后自带一个叫 Window Spy 的工具,在托盘图标右键菜单里能找到。它的作用是实时显示当前鼠标位置下的窗口标题、类名、控件文本和控件类名。中文界面的难点在于:窗口标题和控件文本都是中文,脚本里写中文匹配时,如果编码不对或者窗口标题带了动态内容(比如文件名、页码),匹配就会失败。
实操步骤:打开目标窗口,把鼠标移到要操作的按钮上,看 Window Spy 里「Control Text」那一栏。如果按钮上写的是「确定」,那一栏就会显示「确定」。脚本里用ControlClick点击时,可以直接用这个中文文本作为匹配条件。但要注意,有些软件的按钮文本会随状态变化,比如「开始」变成「停止」,这种就不能写死,得改用控件类名或位置坐标。
; 用中文控件文本点击按钮 ; 假设目标窗口标题包含「数据录入」 WinActivate, 数据录入 WinWaitActive, 数据录入,, 3 if (ErrorLevel) { MsgBox, 没找到数据录入窗口,请检查是否已打开 return } ControlClick, 确定, 数据录入 return逻辑说明:WinActivate激活窗口,WinWaitActive等待窗口激活,第三个参数3是超时秒数。ErrorLevel非 0 说明等待超时,此时弹提示并退出,避免后续操作打到错误的窗口上。ControlClick的第一个参数是控件文本,第二个是窗口标题。这种写法比模拟鼠标点击更稳,因为不受窗口位置和遮挡影响。
参数说明:WinWaitActive的超时时间建议设 2 到 5 秒,太短容易在慢机器上误判,太长会让脚本卡住。ControlClick如果匹配不到控件,会静默失败,不会报错,所以关键步骤后面最好加一个校验,比如检查某个输入框的内容是否变化。
3.2 中文标题的动态匹配
窗口标题里带文件名、页码、未读数量是常态,写死标题必然失效。常见做法是用SetTitleMatchMode把匹配模式改成「包含」或「正则」。包含模式最简单:SetTitleMatchMode, 2之后,只要窗口标题里含有指定字符串就算匹配。正则模式更灵活,但中文正则在不同版本下行为有差异,新手先用包含模式就够了。
; 匹配标题中包含「订单」的窗口,不管后面跟什么 SetTitleMatchMode, 2 WinActivate, 订单 return注意SetTitleMatchMode是全局设置,写在脚本顶部一次即可。如果脚本里同时要匹配多个不同规则的窗口,可以在每次匹配前重新设置,但记得用完改回来,否则后续匹配会沿用错误的模式。这个坑很隐蔽,表现为「明明窗口开着却匹配不到」,排查时先看匹配模式。
3.3 批量操作里的等待与重试
自动化脚本最怕的是目标程序响应慢。点了一个按钮,界面还没刷新,脚本就去点下一个,结果点空或者点到错误的位置。血泪经验是:任何涉及界面刷新的操作后面都要加等待,等待时间宁长勿短。但死等又浪费时间,所以更好的做法是「等待某个条件成立」,比如等待某个控件出现、等待窗口标题变化。
; 点击提交后,等待「提交成功」提示出现,最多等 10 秒 ControlClick, 提交, 数据录入 Loop, 20 { Sleep, 500 ControlGetText, tipText, Static2, 数据录入 if (InStr(tipText, "成功")) { break } } if (A_Index = 20) { MsgBox, 提交后未检测到成功提示,请人工检查 } return逻辑说明:Loop, 20循环 20 次,每次睡 500 毫秒,总共最多等 10 秒。ControlGetText读取指定控件的文本,InStr判断是否包含「成功」二字。A_Index是内置循环计数变量,等于 20 说明循环跑完了还没 break,即超时。这种「轮询 + 超时」的模式比固定Sleep可靠得多,也不会无谓地拖慢脚本。
参数说明:Sleep的 500 毫秒是经验值,界面刷新快的可以降到 200,慢的可以升到 1000。ControlGetText的控件类名Static2需要用 Window Spy 确认,不同软件不一样。如果读不到文本,可以改用WinGetTitle读窗口标题,或者用PixelGetColor判断某个位置的颜色变化,但后者更脆弱,不推荐作为首选。
4. 避坑与排查:中文环境下最容易翻车的五件事
4.1 脚本双击没反应,托盘也没图标
现象:双击.ahk文件后什么都没发生,托盘里也找不到绿色 H 图标。原因通常是脚本第一行就有语法错误,AutoHotKey 会弹一个错误窗口,但如果错误窗口被其他窗口挡住,看起来就像没反应。解决:先看任务栏有没有闪烁的窗口,或者用编辑器打开脚本,检查是否有中文标点混入代码。中文全角逗号、全角引号是新手最常见的翻车点,代码里的逗号和引号必须是半角。
4.2 中文发送变成问号或乱码
现象:脚本发送的中文在目标窗口里显示成???或乱码。原因有两个:脚本文件编码不是 UTF-8 with BOM,或者目标程序本身不支持 Unicode。解决:先用编辑器确认编码,改成 UTF-8 with BOM 后重新加载脚本。如果目标程序是老旧的 GBK 程序,可以尝试把脚本存成 GBK 编码,但这样中文注释在部分编辑器里会显示乱码,属于取舍。更稳的方案是尽量用{Text}模式发送,它对编码的容忍度更高。
4.3 热键被其他软件抢占
现象:脚本里定义了Ctrl+Alt+N,但按下去没反应,或者触发了别的软件的功能。原因:热键是全局注册的,先注册的软件优先。很多截图工具、输入法、显卡驱动都会占用Ctrl+Alt+系列组合。解决:换一组不常用的组合,比如Ctrl+Shift+Alt+加字母,或者用#(Win 键)组合。排查方法是在脚本里加一个MsgBox测试热键是否被触发,如果 MsgBox 都不弹,说明热键没注册上。
4.4 窗口匹配时好时坏
现象:同样的脚本,有时候能匹配到窗口,有时候匹配不到。原因:窗口标题是动态的,或者匹配模式被前面的代码改过没改回来。解决:统一在脚本顶部设SetTitleMatchMode, 2,并且所有窗口匹配都用标题的一部分而不是全称。如果还是不稳定,用 Window Spy 确认窗口类名,改用ahk_class匹配,类名通常比标题稳定。
4.5 脚本运行一段时间后变慢或卡死
现象:脚本刚开始跑得好好的,跑了几百次循环后越来越慢,最后卡死。原因:循环里不断创建对象或累积变量没有释放,或者SendInput发送太快导致目标程序消息队列堆积。解决:在长循环里每隔几十次加一个Sleep, 10让系统喘口气;避免在循环里用Gui创建新窗口;如果用了ComObjCreate,记得在循环外创建、循环内复用。这个坑在批量处理几千条数据时才会暴露,测试时用小数据量跑不容易发现。
5. 进阶技巧:把脚本做成可配置、可复用的工具
5.1 用配置文件分离参数与逻辑
脚本写死参数,换个场景就得改代码,这是不可维护的根源。常见做法是把窗口标题、等待时间、输入内容这些易变项抽到一个.ini文件里,脚本启动时读取。这样非技术同事也能改配置,不用碰代码。
; 读取同目录下的 config.ini ; ini 内容示例: ; [main] ; windowTitle=数据录入 ; waitMs=500 IniRead, winTitle, config.ini, main, windowTitle, 数据录入 IniRead, waitMs, config.ini, main, waitMs, 500 WinActivate, %winTitle% Sleep, %waitMs% return逻辑说明:IniRead的四个参数分别是输出变量、文件名、节名、键名、默认值。默认值很重要,配置文件缺失或键名写错时脚本不会直接崩,而是用默认值继续跑。%winTitle%是 v1 的变量引用写法。这种结构让脚本从「一次性代码」变成「可交付工具」,是值不值得投入的分水岭。
参数说明:.ini文件必须和脚本放同一目录,或者写绝对路径。IniRead读不到时会返回默认值,但不会报错,所以调试阶段可以在读取后加一个MsgBox确认读到的值是否符合预期。
5.2 用函数封装重复逻辑
多个热键里都有「激活窗口、等待、点击、校验」这套流程,复制粘贴多了必然出现改一处漏一处。把公共逻辑抽成函数,热键里只调一行。
; 封装:激活窗口并点击指定控件,返回是否成功 ClickInWindow(winTitle, controlText, timeout := 3) { WinActivate, %winTitle% WinWaitActive, %winTitle%,, %timeout% if (ErrorLevel) { return false } ControlClick, %controlText%, %winTitle% return true } ; 热键里调用 ^!s:: if (ClickInWindow("数据录入", "保存")) { ToolTip, 已保存 SetTimer, RemoveToolTip, -1500 } else { MsgBox, 保存失败,窗口未找到 } return RemoveToolTip: ToolTip return逻辑说明:函数定义用函数名(参数)的形式,参数可以设默认值,timeout := 3表示不传时默认 3 秒。return false和return true让调用方可以判断结果。ToolTip显示一个浮动提示,SetTimer配合负值表示只执行一次,1500 毫秒后自动清除。这种「函数 + 热键」的结构在脚本超过 50 行后几乎是必须的,否则改一个等待时间要翻遍全文。
参数说明:函数名和变量名不要用中文,虽然 v1 支持,但编辑器高亮和调试工具对中文标识符支持不好。字符串参数用双引号,v1 里单引号不是字符串定界符。SetTimer的负值语义是「延迟执行一次」,正值是「周期性执行」,别搞混。
5.3 编译成 exe 与分发时的注意点
脚本写好了想发给别人用,对方没装 AutoHotKey 怎么办?用自带的 Ahk2Exe 工具可以编译成独立 exe。编译时有两个选项要注意:一是「Use MPRESS」压缩,能减小体积但可能被杀毒软件误报;二是「Custom Icon」换图标,默认图标太显眼。编译后的 exe 在 64 位系统上运行 32 位脚本通常没问题,但如果脚本调用了外部 64 位程序,需要确认位数匹配。
分发时还有一个中文相关的坑:如果脚本里用了相对路径读取同目录的配置文件,编译成 exe 后工作目录可能变成系统目录,导致读不到配置。解决办法是用A_ScriptDir内置变量拼绝对路径:
; 无论脚本还是 exe,都从自身所在目录读配置 configPath := A_ScriptDir . "\config.ini" IniRead, winTitle, %configPath%, main, windowTitle, 数据录入 returnA_ScriptDir返回脚本或 exe 所在目录,不带末尾反斜杠,所以拼接时要手动加\。这个细节在开发阶段用脚本运行时看不出问题,编译后才会暴露,属于典型的「后悔药没处买」的坑。
我自己现在的习惯是:任何超过 20 行的脚本,第一件事就是建一个.ini配置文件,第二件事是把窗口操作封装成函数,第三件事是在每个关键步骤后面加超时校验。这三件事做完,脚本才敢交给别人用。中文环境下的自动化,难点从来不在语法,而在编码、输入法和窗口匹配这些边角细节上,把这些摸清了,AutoHotKey 中文版能省下的时间远超投入。希望帮到你。
本文还有配套的精品资源,点击获取