ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

AutoHotkey V2 还能这么玩?我用 ahk2_lib 从零搭了一个截图识字小工具

2026/8/14 13:38:56 拓冰建站 浏览量
AutoHotkey V2 还能这么玩?我用 ahk2_lib 从零搭了一个截图识字小工具 AutoHotkey V2 还能这么玩我用 ahk2_lib 从零搭了一个截图识字小工具【免费下载链接】ahk2_lib项目地址: https://gitcode.com/gh_mirrors/ah/ahk2_lib如果你和我一样写过不少 AutoHotkey 脚本一定体会过那种卡壳的感觉想从屏幕截图里读出文字、想塞一个数据库、想用网页技术做界面……官方函数库统统没有只能对着 Windows 文档一条条写DllCall写完还得提心吊胆怕内存泄漏。直到我翻到AutoHotkey V2 扩展库 ahk2_lib才发现这些痛点早有人替我解决了大半——50 多个模块覆盖 OCR、SQLite、WebView2、系统 API、图像识别从能用的小脚本到像样的桌面工具往往只差一个#Include。这篇文章不打算给你列功能清单那种文章你已经看过一百篇了。我会带你完整走一遍我自己的实战把一个截图识字的小想法一步步变成带数据库、带网页界面的桌面小工具。中间踩过的坑、发现的好东西我都会原原本本讲出来。先说痛处我为什么差点把脚本改成 C事情的起因很朴素。我经常要处理一些游戏和软件里不允许复制的文字工作流是截图 → 打开某个 OCR 工具 → 识别 → 手动整理。来回切换窗口一天能浪费半小时。我当时的第一个念头是反正要调用 DLL不如直接用 C 写个小程序算了。但转念一想——我要的只是截图 → 输出文字这么一件事为它维护一个编译环境、处理一堆命令行参数成本高得离谱。AutoHotkey 的优势从来不是性能而是把系统里的东西粘起来的速度。问题只在于OCR 的 DLL 怎么调自己写DllCall去对接一个陌生库的 C 接口光是搞懂结构体布局就够喝一壶的。发现 ahk2_lib原来粘起来这事可以更粗暴clone 下来之后仓库地址https://gitcode.com/gh_mirrors/ah/ahk2_lib 我第一反应是——这目录也太规整了。每个模块一个文件夹DLL 分32bit/、64bit/两套.ahk封装和示例就躺在旁边RapidOcr/ # OCR 识别 SQLite/ # 数据库 WebView2/ # 网页界面 XCGUI/ # 原生窗口 WinAPI/ # Windows API 封装25 个 dll 的封装 MCode.ahk # 直接运行机器码 Native/ # 内嵌 C 编译的机器码 HttpServer.ahk # 自带 HTTP/WebSocket 服务器最打动我的不是功能多而是每个模块都自带可运行的示例。比如 OCR 模块RapidOcr/RapidOcr.ahk文件头部的注释就是一段完整用法。这意味着我不用去翻第三方库的文档直接看它的注释就能跑起来。三分钟跑通第一个 Demo让它先认出字来我的第一个目标是给一张图片返回识别出的文字。用 RapidOcr 模块代码短到让我怀疑是不是漏了什么#Include RapidOcr\RapidOcr ocr : RapidOcr({ models: A_ScriptDir \models }) ; 指定模型目录 param : RapidOcr.OcrParam() param.doAngle : true ; 自动纠正图片方向 MsgBox ocr.ocr_from_file(demo.png, param) ; 传图片返回文字第一次跑通的时候我愣了几秒——就这么几行是的就这几行。模型文件就在项目自带的RapidOcr/models/里三个 onnx 模型加一个字典文件封装层负责加载 DLL、初始化引擎、处理参数转换我完全不用碰 C 接口。这里有个细节值得说RapidOcr()构造函数会自动按当前 AHK 位数去32bit/或64bit/目录找RapidOcrOnnx.dll。你不用关心自己是 32 位还是 64 位环境这个双架构自动适配的设计在 ahk2_lib 里几乎每个带 DLL 的模块都有比如WebView2/、wincapture/、XL/。这对我这种装完 AHK 就忘了位数的人来说是真省心。让它记性好一点把结果塞进 SQLite识别出文字只是第一步。我很快发现光是弹个MsgBox一点用没有——我要的是积累把每天的截图内容存下来以后能搜能查。这时候SQLite/CSQLite.ahk就派上用场了。这模块是对 sqlite3 的完整封装建库建表插入数据都是直白的调用#Include SQLite\CSQLite db : CSQLite() db.OpenDB(A_ScriptDir \ocr_notes.db) ; 没有就自动创建 db.Exec(CREATE TABLE IF NOT EXISTS notes(id INTEGER PRIMARY KEY, text TEXT, time TEXT)) db.Exec(INSERT INTO notes(text, time) VALUES( ... , datetime(now)))可能有人会问AHK 脚本存个文本文件不就行了为什么要上数据库我的理由是——当你开始积累几百条记录时文本文件和数据库的差距就出来了。CSQLite 支持条件查询、排序、去重还带中文错误信息_ReturnMsg那套映射写得特别贴心报错时直接告诉你数据库文件被锁定而不是一堆 0/1 错误码。不过坦白说这一步我也踩了个小坑CSQLite 需要你自己准备SQLite3.dll在 SQLite 官方下载项目里没有附带。我当时OpenDB一直报文件不存在排查了半天才反应过来。这个坑我会在后面统一列出来。意外收获用网页当界面比我想象的简单功能跑通了可界面还是丑。MsgBox弹文字、纯文本文件查看这实在配不上工具两个字。我的第一反应是学 XCGUI项目里那个原生 UI 库XCGUI/Example/01-Window-普通窗口.ahk的示例很简洁但转念一想我的数据展示想要表格、想要高亮、想要筛选这些用 HTML 写起来简直信手拈来。然后我发现了WebView2/WebView2.ahk——它把 Edge 的 Chromium 内核直接嵌进 AHK 窗口里。也就是说我可以用 HTML/CSS/JavaScript 写界面用 AHK 写逻辑两者还能互相调用。加载一个网页只需要这几行#Include WebView2\WebView2 main : Gui() main.OnEvent(Close, (*) ExitApp()) main.Show(w900 h600) wvc : WebView2.CreateControllerAsync(main.Hwnd).await2() wv : wvc.CoreWebView2 wv.Navigate(file:///D:/ocr_viewer/index.html) ; 打开本地页面CreateControllerAsync(...).await2()这种写法是这库的异步风格所有异步方法带Async后缀返回 Promise 对象然后await2()同步等待结果。第一次看到.await2()我还在想为什么叫2后来才明白是因为 V2 版本的语法——这算是这个库的一个小彩蛋。到这一步我的工具已经成型了热键截图 → RapidOcr 识字 → 存进 SQLite → WebView2 里的网页表格展示。整个过程只用了三个模块每块代码都不超过二十行。顺手挖到的两个隐藏宝箱工具做完之后我出于好奇翻了翻其他模块结果挖到两个让我觉得这库太值了的东西。第一个是MCode.ahk。它能把一段十六进制机器码直接变成可调用的函数; 这是 x64 下的 add eax, ecx; ret两个数相加 code : MCode(x64:8D0411C3) add : DllCall.Bind(code, int, , int, , int) MsgBox add(3, 4) ; 7对大多数人来说手写机器码是屠龙之技。但它的意义在于当你的脚本有性能瓶颈时你不必为了几行关键逻辑去学 C、配编译环境Native/examples.ahk里甚至有更完整的 C 源码转机器码方案。这相当于给会不会编译划上了一条低门槛的退路。第二个是HttpServer.ahk。这库自带一个 HTTP WebSocket 服务器十几行就能起一个带接口的本地服务。我后来给识字工具加了个小功能局域网里的手机浏览器直接访问电脑的 IP就能看到今天识别了哪些内容。一个桌面脚本瞬间变成局域网小应用这种体验在纯 AHK 生态里真的不多见。最容易踩的 5 个坑都是真金白银换来的讲完收获讲讲教训。以下每一个坑我都实打实踩过DLL 位数要和 AHK 位数一致。用 64 位 AHK 就别指望加载32bit/里的 DLLLoadLibrary会静默失败。判断方法是A_PtrSize等于 8 是 64 位。多数模块自动适配但自备 DLL 的模块比如 SQLite得自己盯着。#Include的路径别硬编码。项目里模块互相引用很常见建议把 ahk2_lib 放进 AHK 的Lib目录或用#Include 模块名\文件的尖括号写法这样换机器不用改代码。异步方法别忘.await2()。WebView2 这类模块的所有回调式 API 都返回 Promise忘了等待界面会显示空白还不报错。排查这类问题最耗时间。SQLite3.dll 不是模块自带的。CSQLite.ahk默认去脚本目录找SQLite3.dll没有就抛文件不存在。去 SQLite 官网下一个对应位数的最新版就好注意它要求 3.29 以上版本太老会直接拒绝。资源要手动释放。AHK 的 GC 不像别的语言那么勤快WebView2 控制器、数据库句柄、回调对象用完置空或显式关闭否则退出时可能卡住或残留进程。webview : 0、db : 这种写法看着傻但有用。最后说两句真心话回顾整个过程我最深的感受是ahk2_lib 解决的不是某个功能没有而是我不需要为了一个小功能去换技术栈。OCR、数据库、网页 UI、机器码——这些能力单拎出来AHK 官方库一个都给不了合在一起却只占了我一个周末。我知道很多人在犹豫这库的模块能不能放心用我的看法是——先别管架构和封装细节直接跑它的示例。XCGUI/Example/里有现成窗口示例RapidOcr/有完整识别示例Native/examples.ahk有性能对比。能跑通示例你就已经拿到了这个库的入场券。如果你也写过几段 AHK 脚本、最近正卡在想要的能力官方没有这个坎上我建议你 clone 下来随便挑一个模块跑跑看。不一定要做多复杂的工具——哪怕只是让脚本读个验证码、存个配置、弹个好看的窗口都算迈出了第一步。工具的价值不在代码量而在它替你省下的那半个小时。而 ahk2_lib 这种库的价值在于你想到的每一个要是 AHK 也能……的念头它大概率已经替你实现了。剩下的只是你愿不愿意花一个下午去发现它。【免费下载链接】ahk2_lib项目地址: https://gitcode.com/gh_mirrors/ah/ahk2_lib创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考