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

推荐订阅源

MyScale Blog
MyScale Blog
Microsoft Azure Blog
Microsoft Azure Blog
H
Help Net Security
N
News and Events Feed by Topic
Recent Announcements
Recent Announcements
D
Docker
M
MIT News - Artificial intelligence
L
LangChain Blog
I
InfoQ
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
P
Proofpoint News Feed
博客园_首页
MongoDB | Blog
MongoDB | Blog
美团技术团队
S
Schneier on Security
G
GRAHAM CLULEY
月光博客
月光博客
有赞技术团队
有赞技术团队
Vercel News
Vercel News
Scott Helme
Scott Helme
P
Privacy International News Feed
Last Week in AI
Last Week in AI
Recorded Future
Recorded Future
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
The Cloudflare Blog
Attack and Defense Labs
Attack and Defense Labs
Google Online Security Blog
Google Online Security Blog
Simon Willison's Weblog
Simon Willison's Weblog
量子位
S
Security @ Cisco Blogs
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
V
Visual Studio Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
NISL@THU
NISL@THU
N
Netflix TechBlog - Medium
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Spread Privacy
Spread Privacy
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
小众软件
小众软件
罗磊的独立博客
Security Archives - TechRepublic
Security Archives - TechRepublic
T
Threatpost
L
Lohrmann on Cybersecurity
www.infosecurity-magazine.com
www.infosecurity-magazine.com
S
Security Affairs
Cloudbric
Cloudbric
爱范儿
爱范儿
H
Heimdal Security Blog
PCI Perspectives
PCI Perspectives

博客园 - 立体风

当AI构建自身 nana gui库的回调函数 Nana c++ gui库的对话框函数 -- 理解 nana 的运行机制 介绍 MSVC 的编译命令/ Zc CMake 变量 ${CMAKE_CURRENT_BINARY_DIR} 学习 nana c++ 库 (一) Visual Studio 中行号右边的黄色竖条 大O表示法推导 allocate 中为什么有两个L vs的cl.exe 编译器 c++20 基本配置 IT高频词 address Python Install Manager (PIM,官方安装管理器)简介 debian 中 contrib 软件仓库 debian 版本号及 apt 命令对软件的区分 sysctl的历史及常用命令 极限运算的法则 TeX 的 ctex 宏包的基本用法 XeLaTeX 的基本用法 XeLaTeX 介绍 为什么梯度向量 ∇f 指向函数值增长最快的方向 三角函数的余弦定理的证明 向量点积的几何定义的证明 方向导数公式的证明 仿射函数的定义及用途 凸集的定义及证明 在 LaTeX 公式中处理英文单词 梯度下降法 (Gradient Descent)的数学原理。 梯度下降法简介 向量形式表达最小二乘法 线性回归模型的核心数学表达式 risidual 音标和本义 coefficients的音标及本义(线性模型)
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 中)

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