Skip to content

cWebView2Host 属性与方法使用时机参考

不同 API 在 WebView2 生命周期中的可用时机不同。本文将所有属性和方法按最早可用时机分类,帮助开发者避免在错误阶段调用导致失效或报错。

🔄 生命周期阶段说明

WebView2 的完整生命周期包含 初始化阶段运行阶段,所有事件如下:

初始化阶段(一次性,按顺序触发)

用户调用 Initialize()

① Create 事件 ─── 配置 EnvironmentOptions / Security(仅此事件可设置)

② 内部创建 Environment(读取 EnvironmentOptions 配置)

③ 内部创建 Controller + CoreWebView(读取 Settings 配置)

④ Ready 事件 ─── 控件完全就绪,所有 API 开始可用

⑤ 首次 Navigate(如果指定了 InitialURL)

运行阶段(每次导航循环触发)

Navigate / NavigateCustom / NavigateToString / GoBack / GoForward / Reload

⑥ NavigationStarting ─── 可 Cancel 阻止导航

⑦ SourceChanged ─── URL 变化(IsNewDocument 标识是否新页面)
  ↓  ┌─ ContentLoading(内部事件,未暴露)

⑧ DOMContentLoaded ─── DOM 就绪,可 BindUI / BindData / 执行 JS
  ↓  │
⑨ DocumentTitleChanged ─── 标题变化

⑩ NavigationComplete ─── 页面完全加载(含图片等资源)
     └────────────────────────────────────────┘

每次导航都会重新触发 ⑥→⑩

运行阶段(随时可能触发的交互事件)

┌─ 权限/对话框 ─────────────────────────────────┐
│  PermissionRequested    页面请求权限(地理/相机等)│
│  ScriptDialogOpening    JS 弹框(alert/confirm) │
│  NewWindowRequested     页面请求开新窗口          │
│  AcceleratorKeyPressed  快捷键按下               │
└────────────────────────────────────────────────┘

┌─ 资源/下载 ─────────────────────────────────────┐
│  WebResourceRequested  资源请求被拦截(需先注册) │
│  DownloadStarting      下载即将开始(可 Cancel)  │
│  ProcessFailed         浏览器进程崩溃             │
└────────────────────────────────────────────────┘

┌─ 脚本回调 ──────────────────────────────────────┐
│  JsAsyncResult         异步 JS 执行完成          │
│  JsMessage             JS postMessage 到宿主     │
│  DevToolsProtocolResponse  CDP 异步响应          │
└────────────────────────────────────────────────┘

┌─ 宿主交互 ──────────────────────────────────────┐
│  HostMouseDown/Up/DblClick/Move/Wheel/ContextMenu│
│  HostKeyDown/Up/Press   键盘事件                 │
│  HostFocus / HostBlur   焦点进出                 │
│  HostResize             宿主窗口大小变化           │
└────────────────────────────────────────────────┘

┌─ 内容区鼠标(需 EnableUserMouseEvents=True)────┐
│  UserMouseDown/Up/Move/Wheel/ContextMenu/DblClick│
└────────────────────────────────────────────────┘

┌─ 异步操作回调 ──────────────────────────────────┐
│  SuspendCompleted / SuspendFailed                │
│  PrintToPdfCompleted / PrintToPdfFailed          │
│  OnGetCookiesFull                                │
└────────────────────────────────────────────────┘

┌─ 错误 ─────────────────────────────────────────┐
│  Error                  创建/运行时错误           │
└────────────────────────────────────────────────┘

阶段与 API 可用性对照

阶段时机可做的事
Initialize 调用前对象刚创建仅可设置 EnvironmentOptions 的子属性
Create 事件Environment 创建前设置 EnvironmentOptions、Security 配置
Ready 事件控件完全就绪导航、注册绑定、注入脚本、设置运行时属性
DOMContentLoadedDOM 就绪BindUI、BindData、执行 JS(确保元素存在)
NavigationComplete页面完全加载所有运行时 API 无限制使用
运行时任意时刻Ready 之后所有 API 无限制使用

📋 属性使用时机总览

🔴 仅 Create 事件(创建前配置)

这些属性影响 WebView2 Environment 的创建参数,必须在 wv_Create 事件中设置,之后修改无效。

属性子属性说明
EnvironmentOptionsUserDataFolder用户数据目录,创建 Environment 时读取,之后改了也不生效
BrowserExecutableFolder浏览器可执行文件目录
AdditionalBrowserArguments附加命令行参数(如 --ignore-certificate-errors
Language浏览器默认语言
TargetCompatibleBrowserVersion目标兼容版本
AllowSingleSignOnUsingOSPrimaryAccountSSO 配置
ExclusiveUserDataFolderAccess独占数据目录
EnableTrackingPrevention跟踪防护
SecurityCertificateErrorAction证书错误处理策略,必须在 Create 前设置

示例

vb
Private Sub wv_Create()
    ' ★ 这些只能在 Create 事件中设置!
    wv.EnvironmentOptions.UserDataFolder = App.Path & "\UserDir\account-001"
    wv.EnvironmentOptions.AdditionalBrowserArguments = "--ignore-certificate-errors"
    wv.Security.CertificateErrorAction = CEA_AlwaysAllow
End Sub

🟡 Ready 事件起可用(运行时设置)

这些属性需要 CoreWebView2 Controller/Settings 对象已创建,wv_Ready 事件起可设置。在 Create 事件中设置可能无效(底层 Settings 对象尚未创建)。

属性说明注意
IsPasswordAutoSaveEnabled密码自动保存默认 False,需在 Ready 后设置才生效
IsGeneralAutoFillEnabled表单自动填充默认 False,需在 Ready 后设置才生效
IsScriptEnabledJS 执行开关默认 True
AreDevToolsEnabledDevTools 开关默认 True,生产建议关闭
IsStatusBarEnabled状态栏显示默认 False
IsZoomControlEnabled用户缩放控制默认 True
AreDefaultContextMenusEnabled右键菜单默认 True
UserAgent自定义 UA设置后后续请求生效
IsPinchZoomEnabled捏合缩放默认 True
IsSwipeNavigationEnabled滑动导航默认 True
AreBrowserAcceleratorKeysEnabled浏览器快捷键默认 True
ZoomFactor缩放因子默认 1.0,需要页面已加载
EnableUserMouseEvents内容区鼠标事件默认 False,Ready 后设置并自动注入代理
EnableUserMouseMove内容区 mousemove需 EnableUserMouseEvents 为 True
EnableMouseMoveEvents宿主 mousemove默认 False

示例

vb
Private Sub wv_Ready()
    ' ★ 运行时设置属性
    wv.IsPasswordAutoSaveEnabled = True
    wv.IsGeneralAutoFillEnabled = True
    wv.AreDevToolsEnabled = False      ' 生产环境关闭 DevTools
    wv.UserAgent = "Mozilla/5.0 (MyApp)"
    
    ' 启用鼠标事件代理
    wv.EnableUserMouseEvents = True
End Sub

🟢 任意时间可用(只读状态)

这些属性是只读的,随时可读取,但需要 Ready 后才有有效值。

属性说明Ready 前值
IsReady是否就绪False → True
hWnd子窗口句柄0 → 有效句柄
BrowserProcessId进程 ID0 → 有效 ID
CanGoBack可后退False
CanGoForward可前进False
IsSuspended是否挂起False
IsMuted是否静音False
IsDocumentPlayingAudio播放音频False
IsDefaultDownloadDialogOpen下载对话框False
DocumentURL当前 URL"" → 有效 URL
DocumentTitle当前标题"" → 有效标题
SupportsWebView2~9功能检测Ready 后才有准确值
CookiesCookie 对象Ready 后可用
Script脚本对象Ready 后可用
HostAdapterName适配器名称Initialize 时即有值

📋 方法使用时机总览

🔴 仅 Create 事件

方法说明
目前没有方法仅限 Create 事件使用

注意:Create 事件中虽然可以调用某些方法,但底层 CoreWebView 对象尚未创建,大部分方法会静默失败(被 If m_Core Is Nothing Then Exit Sub 保护)。Create 事件的唯一用途是配置 EnvironmentOptionsSecurity

🟡 Ready 事件起可用

这些方法需要 CoreWebView 对象已创建,wv_Ready 事件起才可调用

方法说明注意
Navigate导航到 URLReady 后调用,Create 中调用无效
NavigateCustom自定义请求导航同上
NavigateToString加载 HTML 字符串同上
GoBack / GoForward / Reload导航控制需有导航历史
ExecuteScript异步执行 JS需页面已加载
JsRun同步调用 JS需页面已加载
JsRunAsync异步调用 JS需页面已加载
JsProp读取 JS 属性需页面已加载
PostWebMessage发送字符串消息需页面已加载
PostWebMessageJSON发送 JSON 消息需页面已加载
AddObject注入 COM 对象Ready 后注入,页面 JS 才能访问
RemoveObject移除 COM 对象
AddScriptToExecuteOnDocumentCreated注入脚本Ready 后注入,后续页面才执行
AddWebResourceRequestedFilter添加资源过滤器Ready 后注册才生效
RemoveWebResourceRequestedFilter移除过滤器
SetVirtualHostNameToFolderMapping虚拟主机映射Ready 后设置,然后 Navigate
ClearVirtualHostNameToFolderMapping清除映射
PrintToPdf打印 PDF需页面已加载
Suspend / Resume挂起/恢复
OpenDevToolsWindow打开 DevTools
CallDevToolsProtocolMethod异步 CDP
CallDevToolsProtocolMethodSync同步 CDP
OpenDefaultDownloadDialog打开下载对话框
CloseDefaultDownloadDialog关闭下载对话框
OpenTaskManagerWindow任务管理器
Resize调整大小
SetFocus设置焦点
BindUIDOM 事件绑定需页面 DOM 存在
UnbindUI移除事件绑定
BindData数据绑定需页面 DOM 存在
UnbindData移除数据绑定
SetData推送数据需已 BindData
SetDataBatch批量推送需已 BindData

🟢 任意时间可用(但建议 Ready 后)

方法说明
Initialize初始化控件,是起点
Cleanup清理资源,随时可调用

🔵 建议在 DOMContentLoaded 后使用

以下方法依赖页面 DOM 已渲染,建议在 wv_DOMContentLoadedwv_NavigationComplete 事件之后调用:

方法说明原因
BindUIDOM 事件绑定需元素已存在于 DOM
BindData数据绑定需元素已存在于 DOM
SetData / SetDataBatch推送数据需已完成 BindData
JsRun / JsProp同步 JS 调用需 JS 环境就绪
Script.Eval同步执行 JS需页面 JS 可执行

最佳实践

vb
Private Sub wv_DOMContentLoaded()
    ' ★ DOM 就绪后绑定 UI 和数据
    wv.BindData "name", "#name-input", "value"
    wv.BindData "name", "#name-preview", "textContent"
    wv.BindUI Me, "OnNameInput", "#name-input", EventName:="input"
    wv.SetData "name", "初始值"
End Sub

⚠️ 常见错误场景

错误做法问题正确做法
在 Form_Load 设置 EnvironmentOptions.UserDataFolderInitialize 内部会覆盖默认值,但用户在 Create 之前的设置会被保留wv_Create 事件中设置
在 Create 事件中 NavigateCoreWebView 尚未创建,静默失败wv_Ready 事件中 Navigate
在 Ready 事件前 AddObject底层 CoreWebView 为 Nothingwv_Ready 事件中 AddObject
在 NavigationStarting 中 BindDataDOM 可能尚未加载wv_DOMContentLoaded 中 BindData
在 Create 中设置 IsPasswordAutoSaveEnabledSettings4 对象尚未创建,可能无效wv_Ready 后设置

🗺️ 快速决策流程图

需要配置 EnvironmentOptions 或 Security?
  → ★ wv_Create 事件

需要设置运行时属性(IsPasswordAutoSaveEnabled 等)?
  → ★ wv_Ready 事件起

需要导航、注入脚本、注册过滤器?
  → ★ wv_Ready 事件起

需要绑定 UI/数据、执行 JS?
  → ★ wv_DOMContentLoaded 事件起(确保 DOM 就绪)

需要读取状态(URL、标题等)?
  → ★ 任意时间(但 Ready 后才有有效值)

最后更新: 2026-06-26

VB6及其LOGO版权为微软公司所有