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