
本文介绍如何利用 WebView2 最新接口(ICoreWebView2_16)调用 ShowPrintUI() 方法,在 Delphi 应用中为 TEdgeBrowser 触发独立于控件尺寸、真正模态的系统原生打印对话框,解决 window.print() 无效及 Ctrl+Shift+P 仅限控件内显示的问题。
本文介绍如何利用 webview2 最新接口(icorewebview2_16)调用 `showprintui()` 方法,在 delphi 应用中为 tedgebrowser 触发独立于控件尺寸、真正模态的系统原生打印对话框,解决 `window.print()` 无效及 ctrl+shift+p 仅限控件内显示的问题。
TEdgeBrowser 作为 Embarcadero 官方推荐的 TWebBrowser 替代组件,底层基于 Microsoft Edge WebView2 运行时。然而,其默认封装并未同步 WebView2 的全部新特性——尤其是模态打印对话框支持,直到 WebView2 运行时版本 ≥ 109.0.1518.46 才正式引入 ShowPrintUI() 方法。该方法可绕过浏览器内嵌限制,直接唤起操作系统级打印对话框(非网页内弹窗),完全脱离 TEdgeBrowser 控件尺寸约束,实现真正的模态交互与全屏可用性。
要启用此功能,需完成以下关键步骤:
✅ 1. 确保运行环境兼容
- 安装 Microsoft Edge 浏览器 ≥ v109 或独立 Microsoft Edge WebView2 Runtime ≥ 109.0.1518.46;
- 在 Delphi 项目中引用最新版 WebView2_TLB.pas(建议从 Microsoft WebView2 SDK 下载并使用 tlbimp 工具重新生成,确保包含 ICoreWebView2_16 接口定义)。
✅ 2. 调用 ShowPrintUI() 实现模态打印
以下为完整、健壮的 Delphi 调用示例(含接口检测与降级处理):
uses
WebView2_TLB, ActiveX;
procedure TForm1.ButtonPrintClick(Sender: TObject);
var
WebView: ICoreWebView2_16;
HR: HResult;
begin
// 安全查询 ICoreWebView2_16 接口(需 WebView2 运行时 ≥ v109)
HR := EdgeBrowser1.DefaultInterface.QueryInterface(ICoreWebView2_16, WebView);
if Succeeded(HR) and Assigned(WebView) then
begin
try
// 显示系统原生打印对话框(模态、跨窗口、支持所有系统打印机)
HR := WebView.ShowPrintUI(COREWEBVIEW2_PRINT_DIALOG_KIND_SYSTEM);
if Failed(HR) then
ShowMessage('打印对话框打开失败:' + SysErrorMessage(HR));
except
on E: Exception do
ShowMessage('调用 ShowPrintUI 异常:' + E.Message);
end;
end
else
begin
// 降级方案:提示用户升级或尝试其他方式(如导出 PDF 后手动打印)
MessageBox(0, '当前 WebView2 版本不支持模态打印,请升级 Edge 或 WebView2 Runtime。',
'打印不可用', MB_ICONWARNING or MB_OK);
end;
end;
⚠️ 注意事项:
- ShowPrintUI() 是异步操作,但对话框本身为系统模态(system-modal),会阻塞当前应用线程直至用户关闭对话框;
- COREWEBVIEW2_PRINT_DIALOG_KIND_SYSTEM 是唯一推荐值(对应 Windows 原生打印 UI),避免使用已废弃的 COREWEBVIEW2_PRINT_DIALOG_KIND_BROWSER;
- 若需无界面打印(如后台生成 PDF),可选用 ICoreWebView2_16.PrintToPdfAsync() 或 PrintWithSettingsAsync(),但二者不触发用户交互。
✅ 3. 避免常见误区
- ❌ 不要依赖 ExecuteScript('window.print();'):该调用仅触发 WebView 内部打印逻辑,在 TEdgeBrowser 当前封装下常被静默忽略或受限于控件渲染区域;
- ❌ 不要依赖键盘快捷键(如 Ctrl+Shift+P):该组合键仅激活控件内嵌的 WebView2 打印面板,受 TEdgeBrowser 尺寸限制,无法扩展至全屏;
- ✅ 始终进行 QueryInterface 检测:不同机器 WebView2 版本可能不一致,强制调用未实现接口将导致 EAccessViolation 或 EOleSysError。
综上,通过接入 ICoreWebView2_16 并调用 ShowPrintUI(),开发者可在 Delphi 中优雅地赋予 TEdgeBrowser 专业级打印能力——真正模态、系统集成、无需 Hack、面向生产环境。建议将 WebView2 运行时检查与接口适配逻辑封装为可复用单元,便于多窗体统一管理。











