很多人第一次接触 H 版,会把它理解成“比普通 v1 更高级的版本”。这个说法不算错,但容易走偏。我的看法是:普通 v1 适合日常热键、窗口控制、GUI 小工具、办公自动化;H 版更像是给复杂脚本准备的扩展工具箱。

如果你现在只是写热键、找图、批量处理文件,先把普通 v1 用熟就够了。只有当你开始遇到多线程、DLL 嵌入、跨语言调用、打包发布、资源内置、源码保护这些需求时,H 版才真正有意义。

先判断自己需不需要

H 版不是普通 v1 的替代品。它能做更多事,但也会带来更多概念:线程对象、AutoHotkey.dll、导出函数、共享对象、编译指令、资源释放。新手直接冲进去,往往不是学会了高级功能,而是先被一堆名词绕晕。

我一般建议这样判断:

  • 只是写个人脚本,普通 v1 优先。
  • 只是想让脚本不卡顿,先检查循环、Sleep、SetTimer、进程拆分,不要一上来就多线程。
  • 需要一个进程里同时跑多个 AHK 执行环境,再考虑 H 版多线程。
  • 需要让 Python、易语言、C#、VBS 这类外部语言调用 AHK,再研究 AutoHotkey.dll。
  • 需要正式发布工具,再研究 H 版编译、资源、版本信息和加密压缩。

最小环境怎么选

如果只是学习 H 版,先不要纠结太多变体。通常先选和自己系统、脚本位数一致的 H 版执行文件。实在不知道怎么选,可以先从不依赖额外 VC 运行库的 MT 版本开始。等脚本跑通以后,再根据 DLL、外部语言、发布方式决定 32 位还是 64 位。

#Requires AutoHotkey v1.1
#NoEnv
#SingleInstance Force
SetBatchLines, -1

MsgBox, H 版脚本也可以先从普通 v1 写法开始

不要一开始就把 H 版当成另一门语言。它仍然是 v1 语法,只是多了一些 H 版扩展能力。普通 v1 的变量、对象、函数、GUI、DllCall、文件操作这些基础,仍然是根基。

第一阶段:知道 H 版多了什么

先建立几个概念就够了:

  • AhkThread() 可以创建新的 AHK 执行环境。
  • AutoHotkey.dll 是 DLL 形态的 AHK 解释器。
  • ahkdll 更适合从脚本文件启动。
  • ahktextdll 更适合从字符串脚本启动。
  • ahkExec 更适合向已存在的环境追加执行一小段代码。
  • CriticalObject 用来做线程之间的共享状态。

这个阶段不要急着写大项目。先跑通最小示例,确认自己理解“普通 Include”和“创建新线程”不是一回事。

#Persistent

t := AhkThread("
(
#Persistent
MsgBox, 这是子线程里的提示
)")

MsgBox, 这是主线程里的提示

#Include 是把代码合并到当前脚本里,还是同一个执行环境。AhkThread() 是另外创建一个执行环境,变量、自动执行段、定时器、消息循环都要按线程重新理解。

第二阶段:把线程当成独立脚本

很多 H 版示例喜欢把线程代码塞进一大段字符串。小例子可以这样写,但真正维护起来很难受:引号、反引号、换行、转义都容易出错。

我的习惯是:线程代码一旦超过几十行,就拆成单独文件。主脚本只负责创建共享状态、启动线程、分发任务;子线程文件只负责自己的业务逻辑。

state := CriticalObject()
state.stop := false
state.msg := "ready"

t := AhkThread(A_ScriptDir "\worker.ahk", "" (&state), true)
; worker.ahk
#NoEnv
#Persistent

state := CriticalObject(A_Args.1)

Loop
{
    if (state.stop)
        ExitApp

    state.msg := "worker: " A_Index
    Sleep, 500
}

这样写的好处是清楚。主线程和子线程的边界越清楚,后面排错越轻松。

第三阶段:再碰 DLL 和外部语言

当你能理解 AhkThread() 以后,再去看 AutoHotkey.dll 会顺很多。DLL 方向常见用途有三类:

  • 在当前进程里加载 AHK 解释器。
  • 让外部语言调用 AHK 脚本能力。
  • 用导出函数创建、调用、控制脚本线程。

这时需要补的不是“更多 H 版语法”,而是 DLL 基础:LoadLibraryGetProcAddress、函数指针、调用约定、参数类型、释放时机。这里和 DllCall 基础关系很大。

第四阶段:发布前再整理工程

H 版真正适合做正式工具时,重点反而不是某个炫技函数,而是工程整理:

  • 脚本入口是否清楚。
  • 线程退出有没有正常释放资源。
  • 版本号、产品名、图标、窗口类名是否固定。
  • 资源文件是否需要内置或释放到本地。
  • 日志和异常提示是否方便用户反馈问题。
  • 32 位和 64 位环境是否都测试过。

H 版适合把 AHK 从“个人脚本”推向“可发布工具”,但前提是基础结构要稳。我的建议是:先用普通 v1 写出可靠功能,再用 H 版解决普通 v1 不好解决的那一段,而不是为了 H 版而 H 版。

我的学习顺序

如果重新给 H 版排学习顺序,我会这样走:

  1. 先把普通 v1 的函数、对象、DllCall、GUI、文件操作用熟。
  2. 理解 H 版和普通 v1 的区别,不急着迁移项目。
  3. 跑通 AhkThread() 最小例子。
  4. 学习 CriticalObject 和线程之间的任务分发。
  5. 学习 AutoHotkey.dll、ahkdll、ahktextdll、ahkExec 的分工。
  6. 再研究外部语言调用、资源打包、发布参数。

这样学会慢一点,但不容易乱。H 版最怕的不是不会用某个函数,而是还没分清主线程、子线程、DLL 环境和普通脚本环境,就把所有代码搅在一起。

H 版帮助文档

  • AHK_H v1 帮助文档总览:查看 H 版新增命令、函数和 DLL 说明。
  • AhkThread:H 版多线程入口,创建新的 AHK 执行环境。
  • CriticalObject:线程之间共享对象时最常用的安全包装。
  • AutoHotkey.dll:DLL 形态的 AHK 解释器和导出函数总入口。
  • ahkdll:从脚本文件启动 DLL 线程。
  • ahktextdll:从字符串脚本启动 DLL 线程。
  • ahkExec:向已存在的 AHK 环境追加执行代码。

站内相关链接

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。