WebView2 控件事件参考
基础事件
Create 事件
- 描述:在 WebView2 控件创建之前触发
- 用途:用于控制环境选项,如设置 UserDataFolder
- 示例:
vb
Private Sub WebView21_Create()
WebView21.EnvironmentOptions.UserDataFolder = Environ("TEMP") & "\myapp\webview2"
End Sub
Ready 事件
- 描述:在 WebView2 控件创建完成并准备就绪时触发
- 用途:可以开始执行导航等操作
- 示例:
vb
Private Sub WebView21_Ready()
' 控件已准备就绪,可以开始导航
WebView21.Navigate "https://www.example.com"
End Sub
Error 事件
- 描述:捕获 WebView2 控件初始化过程中的错误
- 参数:
code
(Long) - 错误代码msg
(String) - 错误信息
- 示例:
vb
Private Sub WebView21_Error(ByVal code As Long, ByVal msg As String)
MsgBox "WebView2 错误: " & msg & " (错误代码: " & code & ")", vbExclamation
End Sub
导航事件
NavigationStarting 事件
- 描述:在页面开始导航前触发
- 参数:
Uri
(String) - 目标URLIsUserInitiated
(Boolean) - 是否由用户触发IsRedirected
(Boolean) - 是否是重定向RequestHeaders
(WebView2RequestHeaders) - 请求头信息Cancel
(Boolean) - 可设置为 True 以取消导航
- 示例:
vb
Private Sub WebView21_NavigationStarting(ByVal Uri As String, _
ByVal IsUserInitiated As Boolean, ByVal IsRedirected As Boolean, _
ByVal RequestHeaders As WebView2RequestHeaders, ByRef Cancel As Boolean)
' 示例:阻止导航到特定域名
If InStr(1, Uri, "blocked-site.com") > 0 Then
Cancel = True
MsgBox "访问已被阻止", vbInformation
End If
End Sub
NavigationComplete 事件
- 描述:在导航完成后触发
- 参数:
IsSuccess
(Boolean) - 导航是否成功WebErrorStatus
(Long) - 错误状态码
- 示例:
vb
Private Sub WebView21_NavigationComplete(ByVal IsSuccess As Boolean, _
ByVal WebErrorStatus As Long)
If IsSuccess Then
Debug.Print "页面加载成功:" & WebView21.DocumentURL
Else
Debug.Print "页面加载失败,错误码:" & WebErrorStatus
End If
End Sub
SourceChanged 事件
- 描述:当 DocumentURL 属性更新时触发,通常在页面导航后
- 参数:
IsNewDocument
(Boolean) - 是否是新文档
- 用途:用于同步更新URL地址栏等界面元素
- 示例:
vb
Private Sub WebView21_SourceChanged(ByVal IsNewDocument As Boolean)
' 假设有一个文本框用于显示当前URL
txtUrl.Text = WebView21.DocumentURL
If IsNewDocument Then
' 新文档加载时的特殊处理
UpdateNavigationButtons
End If
End Sub
DocumentTitleChanged 事件
- 描述:当页面标题变更时触发
- 用途:更新应用程序窗口标题等
- 示例:
vb
Private Sub WebView21_DocumentTitleChanged()
' 更新窗口标题
Me.Caption = WebView21.DocumentTitle & " - My Browser"
End Sub
交互事件
PermissionRequested 事件
- 描述:当网页需要授权访问特定功能时触发(如访问剪贴板、摄像头等)
- 参数:
IsUserInitiated
(Boolean) - 是否由用户操作触发State
(wv2PermissionState) - 权限状态Uri
(String) - 请求权限的页面URLPermissionKind
(wv2PermissionKind) - 权限类型
- 示例:
vb
Private Sub WebView21_PermissionRequested(ByVal IsUserInitiated As Boolean, _
ByRef State As wv2PermissionState, ByVal Uri As String, _
ByVal PermissionKind As wv2PermissionKind)
Select Case PermissionKind
Case wv2PermissionKind.wv2PermissionKindCamera
' 摄像头权限请求
If MsgBox("网站 " & Uri & " 请求访问摄像头,是否允许?", _
vbQuestion + vbYesNo) = vbYes Then
State = wv2PermissionState.wv2PermissionStateAllow
Else
State = wv2PermissionState.wv2PermissionStateDeny
End If
Case wv2PermissionKind.wv2PermissionKindClipboard
' 剪贴板权限自动允许
State = wv2PermissionState.wv2PermissionStateAllow
End Select
End Sub
AcceleratorKeyPressed 事件
- 描述:当快捷键被按下时触发
- 参数:
KeyState
(wv2KeyEventKind) - 按键状态IsExtendedKey
(Boolean) - 是否是扩展键WasKeyDown
(Boolean) - 按键是否处于按下状态IsKeyReleased
(Boolean) - 按键是否已释放IsMenuKeyDown
(Boolean) - 菜单键是否按下RepeatCount
(Long) - 重复次数ScanCode
(Long) - 扫描码IsHandled
(Boolean) - 事件是否已处理
- 示例:
vb
Private Sub WebView21_AcceleratorKeyPressed(ByRef KeyState As wv2KeyEventKind, _
ByVal IsExtendedKey As Boolean, ByVal WasKeyDown As Boolean, _
ByVal IsKeyReleased As Boolean, ByVal IsMenuKeyDown As Boolean, _
ByVal RepeatCount As Long, ByVal ScanCode As Long, _
ByRef IsHandled As Boolean)
' 示例:捕获 Ctrl+B 快捷键
If KeyState = wv2KeyEventKind.wv2KeyEventKeyDown And _
ScanCode = vbKeyB And IsMenuKeyDown Then
' 执行自定义书签功能
AddBookmark
IsHandled = True
End If
End Sub
WebResourceRequested 事件
- 描述:当发起的HTTP请求匹配通过 AddWebResourceRequestedFilter 设置的URI时触发
- 参数:
Request
(WebView2Request) - 请求对象Response
(WebView2Response) - 响应对象
- 示例:
vb
Private Sub WebView21_WebResourceRequested(ByVal Request As WebView2Request, _
ByVal Response As WebView2Response)
' 示例:拦截图片请求并替换为本地图片
If InStr(1, Request.URI, ".jpg") > 0 Or InStr(1, Request.URI, ".png") > 0 Then
Response.Content = LoadFileToByteArray("D:\images\placeholder.png")
Response.Headers = "Content-Type: image/png"
End If
End Sub
' 辅助函数:将文件加载为字节数组
Private Function LoadFileToByteArray(ByVal filePath As String) As Byte()
Dim fileNum As Integer
fileNum = FreeFile
Open filePath For Binary As #fileNum
Dim bytes() As Byte
ReDim bytes(LOF(fileNum) - 1)
Get #fileNum, , bytes
Close #fileNum
LoadFileToByteArray = bytes
End Function
ProcessFailed 事件
- 描述:当WebView2使用的外部进程(如渲染进程或JavaScript进程)失败时触发
- 参数:
Kind
(wv2ProcessFailedKind) - 进程失败类型
- 示例:
vb
Private Sub WebView21_ProcessFailed(ByVal Kind As wv2ProcessFailedKind)
Select Case Kind
Case wv2ProcessFailedKind.wv2ProcessFailedKindBrowserProcessExited
MsgBox "浏览器进程意外退出", vbCritical
' 尝试重新加载页面
WebView21.Reload
Case wv2ProcessFailedKind.wv2ProcessFailedKindRenderProcessExited
MsgBox "渲染进程崩溃", vbExclamation
Case wv2ProcessFailedKind.wv2ProcessFailedKindFrameRenderProcessExited
Debug.Print "框架渲染进程退出"
End Select
End Sub
ScriptDialogOpening 事件
- 描述:当 AreDefaultScriptDialogsEnabled 设置为 False 时触发,允许自定义对话框实现
- 参数:
ScriptDialogKind
(wv2ScriptDialogKind) - 对话框类型Accept
(Boolean) - 是否接受对话框操作ResultText
(String) - 结果文本URI
(String) - 触发对话框的页面URLMessage
(String) - 对话框消息DefaultText
(String) - 默认文本
- 示例:
vb
Private Sub WebView21_ScriptDialogOpening(ByVal ScriptDialogKind As wv2ScriptDialogKind, _
ByRef Accept As Boolean, ByVal ResultText As String, ByVal URI As String, _
ByVal Message As String, ByVal DefaultText As String)
Select Case ScriptDialogKind
Case wv2ScriptDialogKind.wv2ScriptDialogKindAlert
' 自定义 alert() 实现
MsgBox Message, vbInformation, "网页提示"
Accept = True
Case wv2ScriptDialogKind.wv2ScriptDialogKindConfirm
' 自定义 confirm() 实现
Accept = (MsgBox(Message, vbQuestion + vbYesNo) = vbYes)
Case wv2ScriptDialogKind.wv2ScriptDialogKindPrompt
' 自定义 prompt() 实现
Dim result As String
result = InputBox(Message, "请输入", DefaultText)
If result <> "" Then
ResultText = result
Accept = True
Else
Accept = False
End If
End Select
End Sub
NewWindowRequested 事件
- 描述:当需要打开新窗口时触发
- 参数:
IsUserInitiated
(Boolean) - 是否由用户触发IsHandled
(Boolean) - 是否已处理请求Uri
(String) - 目标URLHasPosition
,HasSize
(Long) - 是否指定了位置和大小Left
,Top
,Width
,Height
(Long) - 窗口位置和大小ShouldDisplay...
系列参数 - 窗口UI元素显示选项
- 示例:
vb
Private Sub WebView21_NewWindowRequested(ByVal IsUserInitiated As Boolean, _
ByRef IsHandled As Boolean, ByVal Uri As String, _
ByVal HasPosition As Long, ByVal HasSize As Long, _
ByVal Left As Long, ByVal Top As Long, _
ByVal Width As Long, ByVal Height As Long, _
ByVal ShouldDisplayMenuBar As Long, _
ByVal ShouldDisplayStatus As Long, _
ByVal ShouldDisplayToolbar As Long, _
ByVal ShouldDisplayScrollBars As Long)
' 示例1:在新标签中打开链接
If IsUserInitiated Then
CreateNewTab Uri
IsHandled = True
End If
' 示例2:在默认浏览器中打开链接
'Shell "explorer.exe " & Uri, vbNormalFocus
'IsHandled = True
End Sub
JsMessage 事件
- 描述:当JavaScript调用 window.chrome.webview.postMessage() 时触发
- 参数:
Message
(Variant) - 从JavaScript传递的消息
- 示例:
vb
' VB代码
Private Sub WebView21_JsMessage(ByVal Message As Variant)
' 处理来自JavaScript的消息
Select Case VarType(Message)
Case vbString
Debug.Print "收到文本消息: " & Message
Case vbObject
' 处理JSON对象
Dim json As String
json = Message.stringify()
Debug.Print "收到JSON消息: " & json
End Select
' 发送回复消息给JavaScript
WebView21.PostWebMessage "收到消息:" & Message
End Sub
' JavaScript代码示例:
' window.chrome.webview.postMessage('Hello from JavaScript!');
' window.chrome.webview.addEventListener('message', function(event) {
' console.log('收到VB的回复:', event.data);
' });
PrintToPdfCompleted / PrintToPdfFailed 事件
- 描述:在调用 PrintToPdf 方法后触发,表示PDF导出的成功或失败
- 示例:
vb
Private Sub WebView21_PrintToPdfCompleted()
MsgBox "PDF导出成功!", vbInformation
End Sub
Private Sub WebView21_PrintToPdfFailed()
MsgBox "PDF导出失败", vbCritical
End Sub
' 调用示例:
Private Sub ExportToPdf()
Dim pdfPath As String
pdfPath = App.Path & "\export.pdf"
' 导出当前页面为PDF
WebView21.PrintToPdf pdfPath, _
wv2PrintOrientation.wv2PrintPortrait, _
1.0, , , 20, 20, 20, 20, _
True, False, True, _
"页眉标题", "页脚URL"
End Sub