cWebView2Host 事件参考
📋 事件总览
cWebView2Host 提供 40+ 个事件,覆盖 WebView2 全生命周期。使用事件需以 WithEvents 声明变量:
Dim WithEvents wv As cWebView2Host事件分类索引
| 分类 | 事件 | 触发时机 |
|---|---|---|
| 生命周期 | Create | WebView2 控件创建完成 |
| Ready | 首次导航完成,控件就绪 | |
| Error | 创建或运行时发生错误 | |
| 导航 | NavigationStarting | 导航开始(可取消) |
| NavigationComplete | 导航完成 | |
| SourceChanged | URL 发生变化 | |
| DocumentTitleChanged | 文档标题变化 | |
| DOMContentLoaded | DOM 加载完成 | |
| 权限/对话框 | PermissionRequested | 页面请求权限 |
| ScriptDialogOpening | 脚本对话框弹出(alert/confirm/prompt) | |
| AcceleratorKeyPressed | 快捷键按下 | |
| NewWindowRequested | 页面请求打开新窗口 | |
| 资源 | WebResourceRequested | Web 资源请求被拦截 |
| ProcessFailed | 浏览器进程失败 | |
| DownloadStarting | 下载即将开始 | |
| 脚本 | JsAsyncResult | 异步脚本执行完成 |
| JsMessage | 收到 JS postMessage | |
| DevToolsProtocolResponse | CDP 异步响应 | |
| 宿主鼠标 | HostMouseDown | 宿主区域鼠标按下 |
| HostMouseUp | 宿主区域鼠标释放 | |
| HostMouseDblClick | 宿主区域鼠标双击 | |
| HostMouseMove | 宿主区域鼠标移动 | |
| HostMouseWheel | 宿主区域鼠标滚轮 | |
| HostContextMenu | 宿主区域右键菜单 | |
| 宿主键盘 | HostKeyDown | 宿主区域按键按下 |
| HostKeyUp | 宿主区域按键释放 | |
| HostKeyPress | 宿主区域按键输入 | |
| HostFocus | WebView2 获得焦点 | |
| HostBlur | WebView2 失去焦点 | |
| HostResize | 宿主窗口大小变化 | |
| 用户鼠标 | UserMouseDown | 内容区域鼠标按下 |
| UserMouseUp | 内容区域鼠标释放 | |
| UserMouseMove | 内容区域鼠标移动 | |
| UserMouseWheel | 内容区域鼠标滚轮 | |
| UserContextMenu | 内容区域右键菜单 | |
| UserDblClick | 内容区域鼠标双击 | |
| 挂起 | SuspendCompleted | 挂起成功 |
| SuspendFailed | 挂起失败 | |
| PrintToPdfCompleted | PDF 打印成功 | |
| PrintToPdfFailed | PDF 打印失败 | |
| 业务 | OnGetCookiesFull | 异步 Cookie 获取完成 |
🔄 生命周期事件
Create
WebView2 控件创建完成,但尚未开始导航。
Private Sub wv_Create()触发时机: WebView2 Environment 和 Controller 创建成功后。
用途: 这是配置 EnvironmentOptions 和 Security 的正确时机,因为此时环境已创建但导航尚未开始。
示例:
Private Sub wv_Create()
' 配置用户数据目录
wv.EnvironmentOptions.UserDataFolder = App.Path & "\UserDir\account-001"
' 配置安全选项
wv.Security.CertificateErrorAction = CEA_AlwaysAllow
End SubReady
WebView2 首次导航完成,控件完全就绪。
Private Sub wv_Ready()触发时机: 首次导航完成后触发一次。后续导航不再触发此事件。
用途: 安全地执行初始化操作,如绑定事件、注册数据绑定、注入脚本等。
示例:
Private Sub wv_Ready()
Me.Caption = wv.DocumentTitle
' 设置数据绑定
wv.BindData "name", "#name-input", "value"
wv.BindUI Me, "OnNameInput", "#name-input", EventName:="input"
wv.SetData "name", "默认值"
' 注入脚本
wv.AddScriptToExecuteOnDocumentCreated "window.__appReady = true;"
End SubError
创建或运行时发生错误。
Private Sub wv_Error(ByVal Description As String)参数:
Description- 错误描述信息
🧭 导航事件
NavigationStarting
导航即将开始,可通过 Cancel 参数取消导航。
Private Sub wv_NavigationStarting(ByVal Uri As String, ByVal IsUserInitiated As Boolean, ByRef Cancel As Boolean)参数:
Uri- 目标 URLIsUserInitiated- 是否由用户操作(点击链接等)触发Cancel- 设为 True 可取消导航
示例:
Private Sub wv_NavigationStarting(ByVal Uri As String, ByVal IsUserInitiated As Boolean, ByRef Cancel As Boolean)
' 阻止导航到特定域名
If InStr(UCase(Uri), "ADS.EXAMPLE.COM") > 0 Then
Cancel = True
End If
End SubNavigationComplete
导航完成。
Private Sub wv_NavigationComplete(ByVal IsSuccess As Boolean, ByVal ErrorStatus As wv2ErrorStatus)参数:
IsSuccess- 导航是否成功ErrorStatus- 错误状态码(成功时为 0)
SourceChanged
URL 发生变化。
Private Sub wv_SourceChanged(ByVal IsNewDocument As Boolean)参数:
IsNewDocument- 是否为新文档(而非同页内导航)
DocumentTitleChanged
文档标题发生变化。
Private Sub wv_DocumentTitleChanged()示例:
Private Sub wv_DocumentTitleChanged()
Me.Caption = wv.DocumentTitle
End SubDOMContentLoaded
DOM 内容加载完成(早于 NavigationComplete)。
Private Sub wv_DOMContentLoaded()用途: 在 DOM 就绪但资源(图片等)尚未完全加载时执行操作。
🔐 权限/对话框事件
PermissionRequested
页面请求权限(地理位置、相机、麦克风等)。
Private Sub wv_PermissionRequested(ByVal Uri As String, ByVal PermissionKind As wv2PermissionKind, ByVal IsUserInitiated As Boolean, ByRef State As wv2PermissionState)参数:
Uri- 请求权限的页面 URLPermissionKind- 权限类型枚举IsUserInitiated- 是否由用户操作触发State- 权限状态,可设为wv2PermissionState_Allow或wv2PermissionState_Deny
示例:
Private Sub wv_PermissionRequested(ByVal Uri As String, ByVal PermissionKind As wv2PermissionKind, ByVal IsUserInitiated As Boolean, ByRef State As wv2PermissionState)
' 自动允许来自受信域名的地理位置权限
If PermissionKind = wv2PermissionKind_Geolocation And InStr(Uri, "myapp.com") > 0 Then
State = wv2PermissionState_Allow
Else
State = wv2PermissionState_Deny
End If
End SubScriptDialogOpening
JavaScript 对话框即将弹出(alert / confirm / prompt / beforeunload)。
Private Sub wv_ScriptDialogOpening(ByVal Kind As wv2ScriptDialogKind, ByVal Message As String, ByRef Accept As Boolean)参数:
Kind- 对话框类型Message- 对话框消息内容Accept- 设为 True 接受对话框(等效于点击确定),False 取消
说明: 可用于自定义对话框样式,替换浏览器默认的对话框。
AcceleratorKeyPressed
快捷键按下事件。
Private Sub wv_AcceleratorKeyPressed(ByVal KeyEventKind As wv2KeyEventKind, ByVal VirtualKey As Long, ByRef Handled As Boolean)参数:
KeyEventKind- 按键事件类型(KeyDown/Up/SystemKeyDown/Up)VirtualKey- 虚拟键码Handled- 设为 True 阻止 WebView2 处理此按键
示例:
Private Sub wv_AcceleratorKeyPressed(ByVal KeyEventKind As wv2KeyEventKind, ByVal VirtualKey As Long, ByRef Handled As Boolean)
' 拦截 F5 刷新
If VirtualKey = vbKeyF5 Then
Handled = True
' 自定义刷新逻辑
End If
End SubNewWindowRequested
页面请求打开新窗口(target="_blank" 或 window.open)。
Private Sub wv_NewWindowRequested(ByVal Uri As String, ByVal IsUserInitiated As Boolean, ByRef Handled As Boolean)参数:
Uri- 新窗口的目标 URLIsUserInitiated- 是否由用户操作触发Handled- 设为 True 阻止打开新窗口
示例:
Private Sub wv_NewWindowRequested(ByVal Uri As String, ByVal IsUserInitiated As Boolean, ByRef Handled As Boolean)
' 在当前窗口中导航(阻止弹窗)
Handled = True
wv.Navigate Uri
End Sub📦 资源事件
WebResourceRequested
Web 资源请求被 AddWebResourceRequestedFilter 匹配拦截。
Private Sub wv_WebResourceRequested(ByVal Request As WebView2Request, ByVal Response As WebView2Response)参数:
Request- 请求对象,可读取 Method、Uri、Headers、ContentResponse- 响应对象,设值后 WebView2 使用此响应替代实际网络请求
说明: 必须先调用 AddWebResourceRequestedFilter 注册过滤器,此事件才会触发。
ProcessFailed
浏览器进程失败。
Private Sub wv_ProcessFailed(ByVal FailedKind As wv2ProcessFailedKind)参数:
FailedKind- 进程失败类型枚举
DownloadStarting
下载即将开始。
Private Sub wv_DownloadStarting(ByVal ResultFilePath As String, ByRef Cancel As Boolean, ByRef Handled As Boolean)参数:
ResultFilePath- 下载文件路径Cancel- 设为 True 取消下载Handled- 设为 True 表示已处理
⚡ 脚本事件
JsAsyncResult
异步脚本执行完成(ExecuteScript / JsRunAsync 的回调)。
Private Sub wv_JsAsyncResult(ByVal Token As Long, ByVal Result As String, ByVal ErrorCode As Long)参数:
Token- 调用时指定的令牌Result- JS 执行结果的 JSON 字符串ErrorCode- 错误码,0 表示成功
示例:
wv.ExecuteScript "document.title", 1001
wv.JsRunAsync "fetch('/api').then(r=>r.json())" ' 返回自动 token
Private Sub wv_JsAsyncResult(ByVal Token As Long, ByVal Result As String, ByVal ErrorCode As Long)
If ErrorCode = 0 Then
Debug.Print "Token " & Token & " => " & Result
End If
End SubJsMessage
收到 JS 通过 window.chrome.webview.postMessage() 发送的消息。
Private Sub wv_JsMessage(ByVal Message As String)参数:
Message- JS 发送的消息字符串
示例:
' VB6 侧
Private Sub wv_JsMessage(ByVal Message As String)
Debug.Print "JS消息: " & Message
End Sub
' JS 侧
window.chrome.webview.postMessage("Hello from JS");DevToolsProtocolResponse
CDP 异步调用响应。
Private Sub wv_DevToolsProtocolResponse(ByVal CustomEventId As Variant, ByVal JsonResponse As String)参数:
CustomEventId- 调用时指定的自定义事件 IDJsonResponse- CDP 响应的 JSON 字符串
示例:
wv.CallDevToolsProtocolMethod "Page.captureScreenshot", "{}", "screenshot"
Private Sub wv_DevToolsProtocolResponse(ByVal CustomEventId As Variant, ByVal JsonResponse As String)
If CustomEventId = "screenshot" Then
' 处理截图数据
End If
End Sub🖱️ 宿主鼠标事件
宿主鼠标事件由宿主窗口子类化捕获,反映宿主窗口区域(非 WebView2 内容区域)的鼠标操作。
HostMouseDown
Private Sub wv_HostMouseDown(ByVal Button As wv2MouseButton, ByVal Shift As wv2ShiftState, ByVal X As Long, ByVal Y As Long)参数:
Button- 鼠标按钮(1=左键, 2=右键, 4=中键,位掩码)Shift- 修饰键状态(1=Shift, 2=Ctrl, 4=Alt,位掩码)X,Y- 鼠标坐标(客户端区域像素)
HostMouseUp
Private Sub wv_HostMouseUp(ByVal Button As wv2MouseButton, ByVal Shift As wv2ShiftState, ByVal X As Long, ByVal Y As Long)HostMouseDblClick
Private Sub wv_HostMouseDblClick(ByVal Button As wv2MouseButton, ByVal Shift As wv2ShiftState, ByVal X As Long, ByVal Y As Long)HostMouseMove
Private Sub wv_HostMouseMove(ByVal Button As wv2MouseButton, ByVal Shift As wv2ShiftState, ByVal X As Long, ByVal Y As Long)说明: 需启用 EnableMouseMoveEvents = True 才会触发,默认关闭避免性能问题。
HostMouseWheel
Private Sub wv_HostMouseWheel(ByVal Delta As Long, ByVal Shift As wv2ShiftState, ByVal X As Long, ByVal Y As Long)参数:
Delta- 滚轮增量,正值向上滚动,负值向下
HostContextMenu
Private Sub wv_HostContextMenu(ByVal X As Long, ByVal Y As Long)⌨️ 宿主键盘事件
HostKeyDown / HostKeyUp / HostKeyPress
Private Sub wv_HostKeyDown(ByVal KeyCode As Long, ByVal Shift As wv2ShiftState)
Private Sub wv_HostKeyUp(ByVal KeyCode As Long, ByVal Shift As wv2ShiftState)
Private Sub wv_HostKeyPress(ByVal KeyAscii As Long)HostFocus / HostBlur
Private Sub wv_HostFocus()
Private Sub wv_HostBlur()HostResize
Private Sub wv_HostResize()说明: 宿主窗口大小变化时触发,可在此处调用 wv.Resize() 手动调整 WebView2 大小(如使用 MessageWindowAdapter 时)。
🎯 用户鼠标事件
用户鼠标事件通过 mouseProxy COM 代理从 WebView2 内容区域同步回调到宿主。需启用 EnableUserMouseEvents = True。
UserMouseDown / UserMouseUp
Private Sub wv_UserMouseDown(ByVal Button As Long, ByVal X As Long, ByVal Y As Long, ByVal Shift As Long, ByRef Handled As Boolean)
Private Sub wv_UserMouseUp(ByVal Button As Long, ByVal X As Long, ByVal Y As Long, ByVal Shift As Long, ByRef Handled As Boolean)参数:
Button- 鼠标按钮(1=左键, 2=右键, 4=中键)X,Y- 内容区域内的像素坐标Shift- 修饰键状态Handled- 设为 True 阻止事件继续传播到 WebView2
UserMouseMove
Private Sub wv_UserMouseMove(ByVal X As Long, ByVal Y As Long, ByVal Shift As Long, ByRef Handled As Boolean)说明: 需额外启用 EnableUserMouseMove = True,默认关闭以避免性能问题。
UserMouseWheel
Private Sub wv_UserMouseWheel(ByVal Delta As Long, ByVal X As Long, ByVal Y As Long, ByVal Shift As Long, ByRef Handled As Boolean)UserContextMenu
Private Sub wv_UserContextMenu(ByVal X As Long, ByVal Y As Long, ByRef Handled As Boolean)UserDblClick
Private Sub wv_UserDblClick(ByVal Button As Long, ByVal X As Long, ByVal Y As Long, ByVal Shift As Long, ByRef Handled As Boolean)🔌 挂起/PDF/业务事件
SuspendCompleted / SuspendFailed
Private Sub wv_SuspendCompleted()
Private Sub wv_SuspendFailed(ByVal ErrorCode As Long)PrintToPdfCompleted / PrintToPdfFailed
Private Sub wv_PrintToPdfCompleted(ByVal ResultFilePath As String)
Private Sub wv_PrintToPdfFailed(ByVal ErrorCode As Long)OnGetCookiesFull
异步获取完整 Cookie 完成。
Private Sub wv_OnGetCookiesFull(ByVal CookiesJson As String)触发时机: 调用 wv.Cookies.GetCookiesFullAsync() 后异步返回时。
📐 枚举参考
wv2MouseButton
| 常量 | 值 | 说明 |
|---|---|---|
| 左键 | 1 | 鼠标左键 |
| 右键 | 2 | 鼠标右键 |
| 中键 | 4 | 鼠标中键 |
位掩码组合,可同时包含多个值。
wv2ShiftState
| 常量 | 值 | 说明 |
|---|---|---|
| Shift | 1 | Shift 键 |
| Ctrl | 2 | Ctrl 键 |
| Alt | 4 | Alt 键 |
位掩码组合,检测方式:If Shift And 2 Then ' Ctrl 按下
wv2ScriptDialogKind
| 常量 | 说明 |
|---|---|
| Alert | alert() 对话框 |
| Confirm | confirm() 对话框 |
| Prompt | prompt() 对话框 |
| BeforeUnload | beforeunload 对话框 |
wv2PermissionKind
| 常量 | 说明 |
|---|---|
| Unknown | 未知权限 |
| Microphone | 麦克风 |
| Camera | 摄像头 |
| Geolocation | 地理位置 |
| Notifications | 通知 |
| OtherSensors | 其他传感器 |
| ClipboardRead | 剪贴板读取 |
wv2PermissionState
| 常量 | 说明 |
|---|---|
| Default | 默认(由浏览器决定) |
| Allow | 允许 |
| Deny | 拒绝 |
EnumCertificateErrorAction
| 常量 | 值 | 说明 |
|---|---|---|
| CEA_Default | 0 | 默认行为(拒绝) |
| CEA_Cancel | 1 | 取消请求 |
| CEA_AlwaysAllow | 2 | 始终允许(注入命令行参数) |
最后更新: 2026-06-24