Skip to content

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

导航事件

  • 描述:在页面开始导航前触发
  • 参数
    • Uri (String) - 目标URL
    • IsUserInitiated (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
  • 描述:在导航完成后触发
  • 参数
    • 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) - 请求权限的页面URL
    • PermissionKind (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) - 触发对话框的页面URL
    • Message (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) - 目标URL
    • HasPosition, 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

基于 VB6组件 发布