有些 AHK 工具需要的不只是打开浏览器,而是把网页真正嵌进自己的 GUI:显示本地 HTML、做登录页、渲染富文本、运行 JavaScript,或者让网页和 AHK 双向交换数据。传统 IE 控件已经不适合新项目,WebView2 才是现在更实际的选择。
这套 WebView2.ahk 面向 AutoHotkey v1,封装了 Microsoft Edge WebView2 控件的创建、控制器、环境、事件和大量接口。它与我之前整理过的轻量 WebView2AHK 容器骨架不是同一套素材;本篇这一套更接近完整接口封装,学习成本更高,但能做的事情也更多。
它能做什么
- 在 AHK GUI 中创建和调整 WebView2 控件;
- 导航网页或加载本地 HTML;
- 执行 JavaScript,并接收脚本结果;
- 把 COM 对象作为 Host Object 暴露给网页脚本;
- 监听导航、下载、新窗口、权限、按键等 WebView2 事件;
- 设置用户数据目录、运行时路径和环境选项;
- 打开开发者工具排查页面脚本和网络请求。

最小运行流程
先创建普通 AHK GUI 并取得窗口句柄,再调用 WebView2.create() 创建控制器,从 CoreWebView2 属性取得网页对象,最后 Navigate() 打开页面。窗口尺寸改变时调用 Fill(),让浏览器控件跟随 GUI 客户区变化。
示例还用 Scripting.Dictionary 演示 AddHostObjectToScript()。这类桥接适合向页面提供少量受控数据和命令,但不要把带有敏感能力的对象随意暴露给不可信网页。
依赖和容易忽略的地方
下载包包含 32 位和 64 位 WebView2Loader.dll,必须与 AHK 位数匹配。电脑还需要安装 Microsoft Edge WebView2 Runtime;多数新版 Windows 10 和 11 已装机自带,但精简系统和旧环境仍可能缺失。
WebView2 是异步组件,复杂项目要认真处理创建完成、导航完成、脚本回调和窗口关闭顺序。下载包中还包含功能展示、DeepL 小窗翻译和麦克风权限示例。涉及麦克风等浏览器权限时,应只对明确来源开放,并处理用户拒绝的情况。
下面的简易示例只负责验证控件创建、网页导航、Host Object 和自适应尺寸,适合先确认环境,再继续看大型功能示例。
本文移植自 thqby 的 ahk2_lib,由本站适配为 AutoHotkey v1 版本,原作者及项目版权归其所有。
源项目地址:https://github.com/thqby/ahk2_lib
打包库和示例的下载地址:
demo代码片段展示:
#Requires AutoHotkey v1.1
#NoEnv
#SingleInstance Force
SetBatchLines, -1
#Include <WebView2_v1>
Wv2_State()
{
static state
if (!IsObject(state))
state := Object("Wvc", "", "Wv", "", "Host", "")
return state
}
Gui, +Resize +HwndhWnd
Gui, Show, % "w" Round(A_ScreenWidth * 0.6) " h" Round(A_ScreenHeight * 0.6), WebView2 v1 Simple Demo
try
{
state := Wv2_State()
state.Wvc := WebView2.create(hWnd)
state.Wv := state.Wvc.CoreWebView2
OnMessage(0x0005, "Wv2_OnSize")
state.Host := ComObjCreate("Scripting.Dictionary")
state.Host.Add("str", "str from ahk")
state.Host.Add("number", 42)
state.Wv.AddHostObjectToScript("ahk", state.Host)
state.Wv.Navigate("https://www.autohotkey.com/")
state.Wv.OpenDevToolsWindow()
}
catch e
{
MsgBox, 16, WebView2 v1 Simple Demo, % "Startup failed:`n" e.Message
ExitApp
}
return
GuiSize:
state := Wv2_State()
if (IsObject(state.Wvc))
state.Wvc.Fill()
return
GuiClose:
GuiEscape:
state := Wv2_State()
state.Wvc := ""
state.Wv := ""
state.Host := ""
ExitApp
return
Wv2_OnSize(wParam, lParam, msg, hwnd)
{
state := Wv2_State()
if (IsObject(state.Wvc))
state.Wvc.Fill()
}

评论(0)