WebView4Delphi 简介
WebView4Delphi 是 Delphi/C++Builder 的浏览器控件封装,基于 Microsoft Edge WebView2。它可以在 Delphi 桌面程序里嵌入完整的 Chromium 内核浏览器,支持最新的网页标准和功能。作为 Delphi 桌面应用与现代 Web 技术的桥梁,它可以用于内嵌网页 UI、桌面自动化或脚本插件平台。
一、下载与安装 WebView4Delphi
从 GitHub 官方仓库下载 WebView4Delphi: 访问 https://github.com/salvadordf/WebView4Delphi,选择 Code → Download ZIP 下载压缩包,或通过 Git 命令克隆仓库:
git clone https://github.com/salvadordf/WebView4Delphi.git
二、安装 Edge WebView2 Runtime
依赖环境:从 Microsoft 官方下载 Evergreen 版本: https://developer.microsoft.com/en-us/microsoft-edge/webview2/#download-section
安装完成后需重启系统。
三、安装 WebView4Delphi 组件
- 解压下载的
WebView4Delphi-main.zip压缩文件。 - 用 Delphi 13 打开目录下的
packages\WebView4Delphi.dpk。 - 在 Projects 窗口右键
WebView4Delphi.bpl,点击 Build(或 Compile)。
如果提示 WebView4DelphiVCL_register.pas 出错,可注释掉相关 LOGO 代码(不影响功能):
uses {$IFDEF DELPHI16_UP} System.Classes, Winapi.Windows, System.SysUtils, //{$IFDEF ADDSPLASHSCREENLOGO}ToolsApi,{$ENDIF} {$ELSE} Classes, Windows, SysUtils, {$ENDIF} uWVBrowser, uWVWindowParent; {$IFDEF DELPHI16_UP}{$IFDEF ADDSPLASHSCREENLOGO} procedure AddBitmapToSplashScreen; const {$I ..\source\uWVVersion.inc} var TempBitmap : HBITMAP; TempVersion : string; begin // 添加 IDE 启动画面 Logo(可删除) // if assigned(SplashScreenServices) then // begin // TempBitmap := LoadBitmap(FindResourceHInstance(HInstance), 'WebView2'); // try // TempVersion := IntToStr(WEBVIEW2LOADERLIB_VERSION_MAJOR) + '.' + // IntToStr(WEBVIEW2LOADERLIB_VERSION_MINOR) + '.' + // IntToStr(WEBVIEW2LOADERLIB_VERSION_RELEASE) + '.' + // IntToStr(WEBVIEW2LOADERLIB_VERSION_BUILD); // // SplashScreenServices.AddPluginBitmap('WebView4Delphi ' + TempVersion, TempBitmap, False, 'MIT license'); // finally // DeleteObject(TempBitmap); // end; // end; end; {$ENDIF}{$ENDIF}
- 编译成功后再次右键
WebView4Delphi.bpl点击 Install。 - 安装成功后,Palette 组件栏将显示
TWVBrowser控件。 - 将路径添加到库:菜单 Tools → Options → Language → Delphi → Library Path,把
WebView4Delphi目录下packages和source加进去。
四、部署 WebView2Loader.dll
重要步骤: 如果不复制此文件,程序启动会报错。
在下载的 WebView4Delphi 目录下找到 bin32 或 bin64 文件夹:
- 如果你的开发程序是 32 位,复制
bin32\WebView2Loader.dll - 如果你的开发程序是 64 位,复制
bin64\WebView2Loader.dll
复制到你的项目根目录(与 EXE 文件同一层)。
WebView2Loader.dll 历史版本参考: https://www.nuget.org/stats/packages/Microsoft.Web.WebView2?groupby=Version
五、常见问题解决
- 组件未显示问题: 确认
.bpl文件已正确安装,检查 Delphi 是否重启。验证 Edge WebView2 Runtime 是否安装成功。 - 初始化错误(InitializationError): 确保程序以管理员权限运行,检查系统环境变量是否包含 WebView2 路径。可通过代码检测错误:
if GlobalWebView2Loader.InitializationError then ShowMessage(GlobalWebView2Loader.ErrorMessage);
六、基础使用示例
确认 CreateBrowser 方法在 FormShow 事件中调用,避免在 FormCreate 中初始化。
逻辑控件 WVBrowser,时间控件 Timer,网页显示控件 WVWindowParent1(属性 Browser:=WVBrowser1)。
以下代码演示加载网页的基本流程:
unit Unit1;
interface
uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,Vcl.Controls, Vcl.Forms, Vcl.Dialogs,Vcl.StdCtrls,Vcl.ExtCtrls,Vcl.ComCtrls, Winapi.WebView2, Winapi.ActiveX, uWVBrowserBase, uWVBrowser,uWVWinControl, uWVWindowParent, uWVLoader,uWVCoreWebView2Args, uWVTypes,uWVTypeLibrary;
type
TForm1 = class(TForm)
ButtonLoad: TButton;
Timer1: TTimer;
WVBrowser1: TWVBrowser;
WVWindowParent1: TWVWindowParent;
procedure ButtonLoadClick(Sender: TObject);
procedure WVBrowser1AfterCreated(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
// 窗体显示时触发
procedure TForm1.FormShow(Sender: TObject);
begin
Timer1.Enabled:=False;
WVWindowParent1.Browser:=WVBrowser1;
// 检查 WebView2 加载器初始化是否出错
if GlobalWebView2Loader.InitializationError then
ShowMessage(GlobalWebView2Loader.ErrorMessage)
else
// 如果 WebView2 已经初始化成功
if GlobalWebView2Loader.Initialized then
// 创建浏览器控件,并指定父窗口句柄
WVBrowser1.CreateBrowser(WVWindowParent1.Handle)
else
// 如果还未初始化完成,则启用定时器等待
Timer1.Enabled := True;
end;
// 当点击按钮时,加载指定网页
procedure TForm1.ButtonLoadClick(Sender: TObject);
begin
// 使用 TWVBrowser 的 Navigate 方法打开网页
WVBrowser1.Navigate('https://www.baidu.com');
end;
// 当 WVBrowser 控件完成创建后触发
procedure TForm1.WVBrowser1AfterCreated(Sender: TObject);
begin
// 更新浏览器窗口大小,确保浏览器控件填充父窗口
WVWindowParent1.UpdateSize;
end;
// 定时器事件,用于轮询 WebView2 初始化状态
procedure TForm1.Timer1Timer(Sender: TObject);
begin
// 先关闭定时器,避免重复触发
Timer1.Enabled := False;
// 如果 WebView2 已初始化成功
if GlobalWebView2Loader.Initialized then
// 创建浏览器控件,并指定父窗口句柄
WVBrowser1.CreateBrowser(WVWindowParent1.Handle)
else
// 如果仍未初始化,则再次启用定时器继续等待
Timer1.Enabled := True;
end;
procedure TForm1.Btn_FindInputClick(Sender: TObject);
var
script: wvstring;
begin
// JS 脚本:遍历所有 input,找到 value="文本框 3" 的元素,返回 outerHTML
script := 'var inputs = document.getElementsByTagName("input");' +
'var;' +
'for (var i=0; i<inputs.length; i++) {' +
' if (inputs[i].value === "文本框 3") {' +
' inputs[i].value="新文本 111";' +
' result = inputs[i].outerHTML;' +
' break;' +
' }' +
'}';
// 执行 JS
WVBrowser1.ExecuteScript(script);
end;
procedure TForm1.Btn_GetIdClick(Sender: TObject);
var
script: wvstring;
begin
// 获取指定 ID 的元素内容
script := 'document.getElementById("pagination").innerText = "新的内容 from Delphi";';
// Delphi 13 + WebView4Delphi 旧版本使用 Retrieve HTML 方式获取结果
WVBrowser1.ExecuteScript(script);
end;
// 程序初始化部分,全局 WebView2 加载器配置
initialization
// 创建全局 WebView2 加载器对象
GlobalWebView2Loader := TWVLoader.Create(nil);
// 设置 WebView2 用户数据缓存路径,防止使用默认路径
GlobalWebView2Loader.UserDataFolder := ExtractFileDir(Application.ExeName) + '\CustomCache';
// 启动 WebView2 初始化流程
GlobalWebView2Loader.StartWebView2;
关键点
- 使用
GlobalWebView2Loader检查运行时状态。 Navigate方法传入目标 URL 字符串。- 避免在窗体未显示时调用
CreateBrowser。

