Skip to content

WebView2 控件进程和状态管理

进程管理

BrowserProcessId 属性

  • 描述:获取浏览器进程的 ProcessID
  • 类型:Long
  • 示例
vb
' 获取并显示浏览器进程ID
Private Sub ShowBrowserProcessInfo()
    Dim pid As Long
    pid = WebView21.BrowserProcessId
    Debug.Print "浏览器进程ID: " & pid
End Sub

ProcessFailed 事件处理

  • 描述:处理WebView2相关进程失败的情况
  • 示例
vb
Private Sub WebView21_ProcessFailed(ByVal Kind As wv2ProcessFailedKind)
    Select Case Kind
        Case wv2ProcessFailedKind.wv2ProcessFailedKindBrowserProcessExited
            ' 浏览器进程退出
            HandleBrowserCrash
            
        Case wv2ProcessFailedKind.wv2ProcessFailedKindRenderProcessExited
            ' 渲染进程退出
            HandleRenderProcessCrash
            
        Case wv2ProcessFailedKind.wv2ProcessFailedKindFrameRenderProcessExited
            ' 框架渲染进程退出
            HandleFrameProcessCrash
    End Select
End Sub

Private Sub HandleBrowserCrash()
    ' 记录错误
    LogError "浏览器进程崩溃"
    
    ' 尝试恢复
    If MsgBox("浏览器进程已终止。是否重新加载页面?", _
              vbQuestion + vbYesNo) = vbYes Then
        WebView21.Reload
    End If
End Sub

Private Sub HandleRenderProcessCrash()
    ' 记录错误
    LogError "渲染进程崩溃"
    
    ' 显示错误页面
    WebView21.LoadHtml "<html><body>" & _
                      "<h1>页面渲染失败</h1>" & _
                      "<p>请刷新页面重试。</p>" & _
                      "</body></html>"
End Sub

暂停和恢复

暂停/恢复支持检查

  • 描述:检查是否支持暂停和恢复功能
  • 属性SupportsSuspendResumeFeatures As Boolean
  • 示例
vb
' 检查是否支持暂停/恢复功能
Private Function CanUseSuspendFeatures() As Boolean
    CanUseSuspendFeatures = WebView21.SupportsSuspendResumeFeatures
End Function

Suspend 方法

  • 描述:暂停 WebView2 的处理和渲染
  • 用途:用于实现标签页功能,减少非活动标签的资源占用
  • 示例
vb
' 暂停当前标签页
Private Sub SuspendTab()
    If WebView21.SupportsSuspendResumeFeatures Then
        WebView21.Suspend
    End If
End Sub

Resume 方法

  • 描述:恢复之前暂停的 WebView2 处理和渲染
  • 示例
vb
' 恢复暂停的标签页
Private Sub ResumeTab()
    If WebView21.SupportsSuspendResumeFeatures Then
        WebView21.Resume
    End If
End Sub

IsSuspended 属性

  • 描述:获取 WebView2 是否处于暂停状态
  • 类型:Boolean
  • 示例
vb
' 检查并处理暂停状态
Private Sub HandleTabActivation()
    If WebView21.SupportsSuspendResumeFeatures Then
        If WebView21.IsSuspended Then
            ' 标签页被激活,恢复处理
            WebView21.Resume
        End If
    End If
End Sub

完整的标签页管理示例

vb
' 标签页类型定义
Private Type TabInfo
    WebView As WebView2
    Caption As String
    IsSuspended As Boolean
End Type

' 标签页集合
Private Tabs() As TabInfo
Private ActiveTabIndex As Long

' 切换到指定标签页
Private Sub SwitchToTab(ByVal Index As Long)
    If Index < 0 Or Index > UBound(Tabs) Then Exit Sub
    
    ' 暂停当前活动标签页
    If ActiveTabIndex >= 0 And ActiveTabIndex <= UBound(Tabs) Then
        With Tabs(ActiveTabIndex)
            If Not .IsSuspended And .WebView.SupportsSuspendResumeFeatures Then
                .WebView.Suspend
                .IsSuspended = True
            End If
            .WebView.Visible = False
        End With
    End If
    
    ' 激活新标签页
    With Tabs(Index)
        If .IsSuspended And .WebView.SupportsSuspendResumeFeatures Then
            .WebView.Resume
            .IsSuspended = False
        End If
        .WebView.Visible = True
        .WebView.SetFocus
    End With
    
    ActiveTabIndex = Index
    UpdateTabButtons
End Sub

' 创建新标签页
Private Sub CreateNewTab(ByVal Url As String)
    ' 扩展数组
    ReDim Preserve Tabs(UBound(Tabs) + 1)
    Dim newIndex As Long
    newIndex = UBound(Tabs)
    
    ' 创建新的WebView2控件
    With Tabs(newIndex)
        Set .WebView = Controls.Add("WebView2Control.WebView2", "tab" & newIndex)
        
        ' 配置WebView2
        With .WebView
            .Move TabContainer.Left, TabContainer.Top, _
                  TabContainer.Width, TabContainer.Height
            .IsStatusBarEnabled = False
            .Navigate Url
        End With
        
        .Caption = "新标签页"
        .IsSuspended = False
    End With
    
    ' 切换到新标签页
    SwitchToTab newIndex
End Sub

' 关闭标签页
Private Sub CloseTab(ByVal Index As Long)
    If Index < 0 Or Index > UBound(Tabs) Then Exit Sub
    
    ' 移除WebView2控件
    Controls.Remove Tabs(Index).WebView.Name
    
    ' 重组数组
    For i = Index To UBound(Tabs) - 1
        Tabs(i) = Tabs(i + 1)
    Next i
    
    ReDim Preserve Tabs(UBound(Tabs) - 1)
    
    ' 如果关闭的是当前标签页,切换到其他标签页
    If Index = ActiveTabIndex Then
        If UBound(Tabs) >= 0 Then
            SwitchToTab IIf(Index > 0, Index - 1, 0)
        End If
    ElseIf Index < ActiveTabIndex Then
        ActiveTabIndex = ActiveTabIndex - 1
    End If
    
    UpdateTabButtons
End Sub

这个示例展示了如何结合使用暂停/恢复功能来实现一个完整的多标签页浏览器。它包含了:

  • 标签页数据结构
  • 标签页切换逻辑
  • 新建标签页功能
  • 关闭标签页功能
  • 资源管理优化

基于 VB6组件 发布