惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

爱范儿
爱范儿
腾讯CDC
博客园 - 司徒正美
A
About on SuperTechFans
H
Help Net Security
J
Java Code Geeks
C
Check Point Blog
B
Blog RSS Feed
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
MongoDB | Blog
MongoDB | Blog
U
Unit 42
Hugging Face - Blog
Hugging Face - Blog
Last Week in AI
Last Week in AI
MyScale Blog
MyScale Blog
V
Visual Studio Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
I
InfoQ
H
Hackread – Cybersecurity News, Data Breaches, AI and More
F
Fortinet All Blogs
博客园 - 聂微东
酷 壳 – CoolShell
酷 壳 – CoolShell
GbyAI
GbyAI
博客园 - 【当耐特】
雷峰网
雷峰网

博客园 - 立体风

autohotkey2.0 Send keys参数分析 autohotkey2.0 盲从模式 windows 10 下 vscode 编写编译一个 nana c++ 库的示例程序 vscode 插件 cmake-tools 输出内容解读 Claude Code 处理中文乱码问题 python 启动器命令 py 答惑 windows 下 python 3.11 的版本问题 pip 安装 老版本 pytorch 的一个容易迷惑的错误 sentence transformer 例子及说明 Sentence Transformers 介绍 Jina Reranker 替代方案:改用 ModelScope 模型 Webnovel Writer 6.2.1 项目分析 windows 10 LTSC 版 安装 Terminal autohotkey2.0 脚本运行机制 windows wsl2 安装 gentoo 的步骤 windows 10 LTSC版 打开 wsl2 autohotkey 提示词 编译安装最新版 perl rust 做到“快并且安全” 的逻辑思路 rust 和 go 语言的核心目的 用 vim 查看文件的格式和编码 throughput 和 efficient 词义 python 以字符数量分割文档 (三) python 以字符数量分割文档 (二) python 以字符数量分割文档 (一) GNU Bash 参考手册(中文版)(六) GNU Bash 参考手册(中文版)(五) GNU Bash 参考手册(中文版)(四) GNU Bash 参考手册(中文版)(三) GNU Bash 参考手册(中文版)(二)
AutoHotkey v2 的源码学习路线
立体风 · 2026-06-17 · via 博客园 - 立体风

AutoHotkey v2 的源码结构清晰,建议按以下路径逐步深入:

推荐学习路径

第一阶段:建立整体认知(1-2 周)

1. 从顶层目录结构开始

AutoHotkey/
├── source/          ← 核心源码目录
│   ├── script.h/.cpp      # 脚本解析器
│   ├── script2.cpp        # 内置命令实现
│   ├── script_func_impl.h/.cpp  # 函数实现
│   ├── window.h/.cpp        # GUI/窗口管理
│   ├── keyboard_mouse.h/.cpp # 热键/热字串输入处理
│   ├── globaldata.h/.cpp    # 全局状态
│   ├── application.h/.cpp   # 主程序入口
│   └── ...
├── source_v1/       # v1 兼容层(可跳过)
└── 其他构建文件

2. 先看 source/application.cpp

  • 这是程序入口(WinMain),理解初始化流程
  • 如何加载脚本、启动消息循环、退出清理

3. 再看 source/globaldata.hsource/globaldata.cpp

  • 了解全局状态变量(g_script, g_array 等线程结构)
  • 理解 AutoHotkey 的线程模型基础

第二阶段:理解脚本引擎(2-3 周)

4. source/script.h — 核心头文件
这是整个项目的"地图",包含:

  • Script 类:脚本加载、解析、执行
  • Line / Label / Func 结构:脚本元素的内存表示
  • 表达式解析相关定义

5. source/script.cpp — 脚本解析

  • 脚本文件如何被逐行读取和解析
  • 热键定义(::hotkey::)的识别
  • 标签、函数、变量的注册机制

6. source/script2.cpp — 内置命令

  • 每个内置命令对应一个 BIF_(Built-In Function)函数
  • 例如 BIF_MsgBox, BIF_Send
  • 这是了解 AutoHotkey 功能实现的最好入口

第三阶段:深入核心机制(3-4 周)

7. 热键/输入系统:source/keyboard_mouse.cpp

  • 全局钩子(SetWindowsHookEx)的安装
  • 热键触发后的线程调度
  • 与 Windows 消息循环的交互

8. 表达式引擎:source/ExprEval.cpp(或类似文件)

  • 中缀表达式转后缀表达式
  • 变量解析和求值
  • 对象/数组的访问链

9. 对象系统:source/Object.h/.cpp

  • AutoHotkey v2 的面向对象基础
  • Array, Map, Object 的实现
  • 元函数(__Call, __Get, __Set)的派发

第四阶段:高级专题(按需深入)

专题 对应文件
GUI 系统 source/window.h/.cpp, source/gui.h/.cpp
COM/DllCall source/script_com.h/.cpp
文件/注册表操作 source/script2.cpp 中相关 BIF
线程与中断 source/globaldata.h, source/MsgSleep() 相关
注册回调(你之前看的) source/script_func_impl.h 中的 CallbackCreate

具体建议

先读这些文件(按顺序)

1. source/application.cpp      ← 入口,了解程序生命周期
2. source/globaldata.h          ← 全局状态,理解线程结构
3. source/script.h              ← 核心数据结构总览
4. source/script.cpp            ← 脚本解析流程(选读 LoadFromFile 等关键函数)
5. source/script2.cpp           ← 挑熟悉的命令读实现(如 Send, MsgBox, Sleep)
6. source/keyboard_mouse.cpp    ← 热键机制(从 SetWindowsHookEx 开始追踪)

学习方法

  1. 带着问题读:比如"Sleep 命令是怎么实现的?" → 找到 BIF_Sleep → 追踪 Sleep() 的调用
  2. 用调试器跟踪:编译 Debug 版本,在 WinMain 或某个 BIF 函数下断点,单步执行
  3. 做笔记画调用图:AutoHotkey 的函数调用链较长,画图帮助理解
  4. 对比文档:官方文档中的命令说明与源码实现对照

编译建议

AutoHotkey 使用 Visual Studio 解决方案文件(.sln),直接打开即可编译。建议:

  • 先编译成功能运行的版本
  • 然后修改某个内置命令(如加个 OutputDebug 输出),验证改动生效
  • 逐步尝试更复杂的修改

一个快速验证理解的练习

尝试回答:当用户按下 ^a::MsgBox "Hello" 时,代码执行路径是什么?

答案线索

  1. keyboard_mouse.cpp → 钩子回调收到 Ctrl+A
  2. 查找注册的热键 → 找到对应的 Line 结构
  3. MsgSleep() 或线程调度 → 创建新线程执行
  4. script.cpp → 执行 LineAction 字段
  5. 最终调用 BIF_MsgBox(在 script2.cppscript_func_impl.h 中)

按照这个路径,你就能把分散在多个文件中的机制串联起来。