Microsoft Edge WebView2 与 Delphi

· 组件

TsgcWebView2 是一个新的可视化 Delphi 组件,封装了 Microsoft Edge WebView2,让您可以在任何 VCL 应用程序中嵌入基于 Chromium 的现代浏览器引擎。将其拖放到窗体上,设置 URL,即可获得功能完整的嵌入式浏览器——支持 Cookie 管理、下载控制、JavaScript 集成、打印支持等更多功能。

与 Delphi 近期版本内置的 TEdgeBrowser 不同,TsgcWebView2 支持从 Delphi 7 到 Delphi 13 的所有版本——这是目前所有 WebView2 封装中最广泛的版本支持。它是 eSeGeCe 公司 sgcWebSockets 库的一部分。

本文介绍其功能集、提供实用代码示例、与 TEdgeBrowser 进行对比,并说明其内部架构。

功能概览

TsgcWebView2 通过清晰的 Delphi 事件和方法公开了 WebView2 SDK 的广泛接口。以下是十二个主要功能组:

导航
Navigate、GoBack、GoForward、Reload、Stop。支持带自定义请求头和请求体的 POST 导航。
JavaScript 执行
异步或同步执行 JavaScript。注册在每次页面加载时自动执行的初始化脚本。
Cookie 管理
以编程方式获取、添加、更新和删除 Cookie。完整访问 Cookie 属性,包括域名、路径和过期时间。
下载控制
提供下载开始、进度和完成事件。将下载重定向到自定义路径或完全取消下载。
配置文件管理
支持多配置文件以实现独立的浏览会话。可按配置文件清除浏览数据(缓存、Cookie、历史记录)。
打印支持
将当前页面打印为 PDF 或显示系统打印对话框。控制纸张大小、方向和页边距。
音频/静音控制
检测文档是否正在播放音频。以编程方式切换静音状态,不影响系统音量。
证书处理
通过专用事件响应客户端证书请求和服务器证书错误。
上下文菜单
拦截并完全自定义右键菜单。使用您自己的操作添加、删除或替换菜单项。
Favicon 访问
获取当前页面的 Favicon URI。通过专用事件响应 Favicon 变更。
虚拟主机映射
将自定义主机名映射到本地文件夹。像真实 Web 服务器一样提供本地 HTML/CSS/JS 文件。
截图捕获
将可见页面内容保存为 PNG 或 JPEG 图像,适用于缩略图、报告或自动化测试。

快速入门

使用 TsgcWebView2 最简单的方式是将其拖放到 VCL 窗体上并调用 Navigate。组件会自动处理 WebView2 环境创建、控制器初始化和视图绑定。

// Drop TsgcWebView2 on your form, then:
procedure TForm1.FormCreate(Sender: TObject);
begin
  sgcWebView2.Navigate('https://www.example.com');
end;
procedure TForm1.sgcWebView2NavigationCompleted(Sender: TObject;
  aIsSuccess: Boolean; aWebErrorStatus: Integer);
begin
  if aIsSuccess then
    Caption := sgcWebView2.DocumentTitle;
end;

OnNavigationCompleted 事件在页面加载完成后触发,报告导航是否成功及任何错误状态码。这是更新 UI(窗口标题、状态栏、前进/后退按钮状态)的最佳时机。

注意:组件在首次使用时懒加载创建 WebView2 环境。如需配置环境选项(浏览器文件夹、语言、命令行开关),请在调用 Navigate 之前通过 EnvironmentOptions 属性进行设置。

CookieManager 子对象公开了完整的 WebView2 Cookie API。您可以列出当前 URL 的 Cookie,添加或更新具有特定属性的 Cookie,以及删除单个 Cookie 或一次性清除所有 Cookie。

// List cookies for the current page
sgcWebView2.CookieManager.GetCookies(sgcWebView2.URL);
// Delete all cookies
sgcWebView2.CookieManager.DeleteAllCookies;
// Add a cookie
sgcWebView2.CookieManager.AddOrUpdateCookie(
  'session', 'abc123', '.example.com', '/');

调用 GetCookies 后,结果将异步通过 OnCookiesReceived 事件返回。每个 Cookie 包含名称、值、域名、路径、过期时间、Secure 标志和 HttpOnly 标志。这是 TEdgeBrowser 完全未公开的功能之一。

提示:在导航到受保护页面之前使用 AddOrUpdateCookie 注入认证令牌,从而避免嵌入式浏览器场景中的登录表单流程。

JavaScript 集成

TsgcWebView2 提供三种 JavaScript 执行方式,各适用于不同场景:

异步执行

调用 ExecuteScript,在 OnScriptExecuted 事件中处理结果。这是标准的非阻塞方式。

// Async execution - result arrives in OnScriptExecuted event
sgcWebView2.ExecuteScript('document.title');
procedure TForm1.sgcWebView2ScriptExecuted(Sender: TObject;
  const aResult: string; aErrorCode: Integer);
begin
  if aErrorCode = 0 then
    ShowMessage('Title: ' + aResult);
end;

同步执行

当需要立即获取结果时,使用 ExecuteScriptSync。该方法会阻塞调用线程直到脚本完成并直接返回结果。

var
  vTitle: string;
begin
  vTitle := sgcWebView2.ExecuteScriptSync('document.title');
  Caption := vTitle;
end;

初始化脚本

初始化脚本注册一次,在每次页面加载时自动执行,且在任何页面 JavaScript 之前运行,非常适合注入全局配置或 polyfill。

// Runs on every page load, before any page scripts
sgcWebView2.AddInitScript('window.appVersion = "1.0";');

下载管理

下载通过事件驱动模型处理。下载开始时,OnDownloadStarting 事件允许您将文件重定向到自定义路径、取消下载或按默认方式继续。下载完成时触发 OnDownloadCompleted 事件。

procedure TForm1.sgcWebView2DownloadStarting(Sender: TObject;
  const aURI, aResultFilePath: string;
  var aCancel: Boolean;
  var aHandled: Boolean;
  var aFilePath: string);
begin
  // Redirect download to custom folder
  aFilePath := 'C:\Downloads' + ExtractFileName(aResultFilePath);
  aHandled := True;
end;
procedure TForm1.sgcWebView2DownloadCompleted(Sender: TObject;
  const aFilePath: string; aState: Integer);
begin
  ShowMessage('Download complete: ' + aFilePath);
end;

POST 导航与自定义请求头

标准导航使用 GET 请求加载 URL。对于 API 测试、表单提交或需要不同 HTTP 方法的场景,NavigateWithPostData 允许在单次调用中指定方法、请求体和请求头。

// Navigate with POST data and custom headers
sgcWebView2.NavigateWithPostData(
  'https://api.example.com/submit',
  'POST',
  '{"key":"value"}',
  'Content-Type: application/json' + #13#10 +
  'Authorization: Bearer token123'
);

与 TEdgeBrowser 的对比

Delphi 从 10.4 Sydney 起内置了 TEdgeBrowser(XE7+ 版本可通过 GetIt 获取)。它提供了基本的 WebView2 封装,但许多 SDK 功能未公开。下表展示了 TsgcWebView2 的优势所在。

功能TEdgeBrowserTsgcWebView2
Delphi 版本支持仅 XE7+D7 至 D13
Cookie 管理✓ 完整 API
下载进度事件✓ 开始/进度/完成
配置文件/清除浏览数据
音频/静音控制
Favicon 访问
证书事件
基本认证事件
状态栏文本
虚拟主机映射
共享缓冲区
同步 ExecuteScript
截图捕获
初始化脚本
POST 导航
打印支持
设计时设置WebView 未创建时抛出异常✓ 安全的 TPersistent 属性
上下文菜单PopupMenu 合并完整事件控制
优雅降级✓ 按功能版本检查
原始 COM 访问

高级功能

打印为 PDF

sgcWebView2.PrintToPdf('C:\output\page.pdf');

截图捕获

sgcWebView2.CapturePreviewToFile('C:\screenshots\page.png', 0); // 0 = PNG

虚拟主机映射

// Serve local files via https://app.local/
sgcWebView2.SetVirtualHostNameToFolderMapping(
  'app.local', 'C:\MyApp\WebContent', 1);
sgcWebView2.Navigate('https://app.local/index.html');

音频与静音控制

sgcWebView2.IsMuted := True;
if sgcWebView2.IsDocumentPlayingAudio then
  ShowMessage('Audio is playing');

架构与设计

TsgcWebView2 基于清晰的三层架构构建,在保持开发者 API 简洁的同时实现关注点分离:

要求

总结

TsgcWebView2 是 Delphi 中最完整的 WebView2 封装。它是 TEdgeBrowser 的严格超集,新增了 Embarcadero 内置组件未公开的十二项功能,并支持从 Delphi 7 到 Delphi 13 的最广泛版本范围,是 Delphi 开发者嵌入现代浏览器的首选方案。