从普通 AutoHotkey v1 迁移到 AHK_H v1,不建议一上来就重写脚本。最稳的路线是:先换运行环境,让原脚本保持原样运行;确认没问题后,再逐步引入 H 版能力。

迁移前先把文档入口收藏好:AHK_H v1 帮助文档。这篇按“最小改动”思路来讲,目标是让普通 v1 项目平滑过渡。

一、第一步只换解释器,不改业务代码

先用 AHK_H v1 运行原来的普通 v1 脚本,不要马上加入 AhkThreadWinApiStruct 这些 H 版功能。这样可以判断问题来自环境,还是来自你新增的代码。

#Requires AutoHotkey v1.1
#NoEnv
#SingleInstance Force
SetWorkingDir, %A_ScriptDir%

MsgBox, 先确认普通 v1 脚本在 AHK_H v1 下可以正常运行
return

如果原脚本本来就依赖路径、权限、编码、外部库,先把这些基础问题排干净。

二、保留普通 v1 写法作为主线

迁移初期,热键、函数、标签、COM、文件读写、窗口控制都继续用普通 v1 写法。H 版新增能力只放到明确需要的模块里。

这样做的好处是:脚本仍然容易读,出了问题也容易判断是哪一层导致的。

三、给 H 版专用代码做隔离

如果你开始使用 AhkThreadDynaRunWinApi,建议单独放到函数或独立文件里,不要散落在主流程里。

StartWorker() {
    script := "MsgBox, Worker started"
    return AhkThread(script)
}

StopWorker(ByRef thread) {
    if IsObject(thread)
    {
        thread.ahkTerminate()
        ahkthread_free(thread)
        thread := ""
    }
}

这样以后要回退普通 v1,或者排查 H 版问题,都会轻松很多。

四、不要把 DynaRun 和 AhkThread 混为一谈

DynaRun 是新进程动态运行代码,AhkThread 是 AutoHotkey.dll 创建当前进程内的新 AHK 线程。迁移时要先想清楚:你需要隔离进程,还是需要线程协作。

; 新进程,适合临时独立任务
pid := DynaRun("MsgBox, 独立进程", "Task1")

如果只是避免主脚本卡住,新进程往往更简单;如果要共享变量、对象或调用线程函数,才考虑 AutoHotkey.dll 和 AhkThread。

五、编译脚本时同步迁移 Ahk2Exe

AHK_H 的编译能力和普通 v1 不完全一样。文档提到 H 版可以编译 AutoHotkey.dll、AutoHotkey.exe、AutoHotkeySC.bin,并支持 H 版功能。迁移项目时,不能只换本地解释器,还要检查发布用的 Ahk2Exe 和 bin 文件。

  • 运行时用的是不是 AHK_H v1。
  • 编译器是不是 H 版 Ahk2Exe。
  • 编译目标是 exe、dll 还是 SC.bin。
  • 是否使用了资源、库文件、加密压缩。

六、检查库路径和自动包含

AHK_H 文档提到,除常规用户库和本地库外,还支持从 %A_AhkExeDir%\lib.lnk 指向的文件夹中自动包含库。迁移后如果库加载异常,要检查解释器目录、脚本目录和库路径。

七、窗口类名不要随便改

H 版提供 #WindowClassMain#WindowClassGui。它们能改主窗口类名和 GUI 窗口类名,但迁移初期不建议动。

如果你的脚本之间用 ahk_class AutoHotkeyahk_class AutoHotkeyGUI 通信,改类名会直接影响旧逻辑。

八、底层 API 迁移要逐步替换

普通 v1 里已经写好的 DllCall,没必要为了 H 版强行改成 WinApi#DllImport。先保持原样稳定运行,再挑重复度高、参数固定的 API 封装。

; 迁移初期:旧 DllCall 可以先保留
MsgBox, % DllCall("GetCurrentProcessId")

等项目稳定后,再考虑用 #DllImportDynaCall 提高可读性。

九、推荐迁移顺序

  • 备份原脚本和运行环境。
  • 用 AHK_H v1 直接运行原脚本。
  • 确认路径、权限、编码、库文件都正常。
  • 保持普通 v1 主体写法,不急着改底层。
  • 需要动态脚本时先试 DynaRun
  • 确实需要线程协作时再引入 AhkThread
  • 最后再处理编译、资源、库路径和发布流程。

结语

迁移到 AHK_H v1 的关键不是“多改”,而是“少改”。普通 v1 脚本能稳定工作的部分尽量保留;只有当需求明确需要 H 版能力时,再小范围引入。这样既能享受 AHK_H 的高级能力,也不会把原本稳定的脚本改乱。

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