如何通过TEdgeBrowser实现模态打印对话框?遇脚本执行无弹窗问题
TEdgeBrowser 实现模态打印对话框的解决方案
1. 解决window.print()无弹窗的问题
直接调用window.print()失效,通常是因为TEdgeBrowser的脚本执行上下文限制或打印权限未开启。更可靠的方式是使用组件原生的Print方法:
EdgeBrowser.Print(True); // 参数True表示显示打印对话框
调用前需确保页面已完全加载(可在OnDocumentCompleted事件中触发),同时检查组件核心设置:
- 确认
EdgeBrowser.CoreWebView2.Settings.IsScriptEnabled = True - 确认
EdgeBrowser.CoreWebView2.Settings.IsPrintingEnabled = True
2. 实现独立模态打印对话框(脱离小窗口限制)
默认打印对话框会依附于TEdgeBrowser的小窗口,可通过Windows API调整对话框的父窗口,使其成为应用主窗口的模态对话框:
procedure TForm1.btnPrintClick(Sender: TObject); var hPrintDialog: HWND; begin // 触发打印对话框 EdgeBrowser.Print(True); // 等待对话框加载(根据实际情况调整延迟) Sleep(300); // 查找打印对话框窗口(中文系统标题为"打印",英文系统改为"Print") hPrintDialog := FindWindow(nil, '打印'); if hPrintDialog <> 0 then begin // 将对话框父窗口设置为应用主窗口 SetParent(hPrintDialog, Self.Handle); // 居中显示在主窗口 CenterWindow(hPrintDialog); // 锁定主窗口,实现模态效果 EnableWindow(Self.Handle, False); // 等待对话框关闭 while IsWindow(hPrintDialog) do begin Application.ProcessMessages; end; EnableWindow(Self.Handle, True); end; end;
多语言适配:可通过窗口类名查找(Edge打印对话框类名为Chrome_WidgetWin_1),避免标题差异问题:
hPrintDialog := FindWindow('Chrome_WidgetWin_1', nil);
3. 替代方案:生成PDF后调用系统打印对话框
如果上述方法仍有问题,可先将页面导出为PDF,再调用系统原生打印对话框(天然模态且独立):
procedure TForm1.btnPrintToPdfClick(Sender: TObject); var PdfPath: string; begin PdfPath := TPath.Combine(TPath.GetTempPath, 'temp_print.pdf'); // 异步生成PDF EdgeBrowser.CoreWebView2.PrintToPdfAsync( PdfPath, nil, procedure(Succeeded: Boolean; const PdfPath: string) begin if Succeeded then begin // 调用系统打印对话框打印PDF ShellExecute(0, 'print', PChar(PdfPath), nil, nil, SW_HIDE); // 打印完成后删除临时PDF TThread.Synchronize(nil, procedure begin DeleteFile(PdfPath); end); end; end); end;
内容的提问来源于stack exchange,提问作者Kyle Williamson
相关产品推荐
相关产品推荐

