WPF实现静默打印时如何移除默认弹出的打印设置对话框?
WPF实现静默打印、移除系统打印弹窗的调整方法
你现在的代码直接用PrintDialog实例发起打印请求,既没绑定固定的目标打印机,也没屏蔽系统层面的打印进度提示,所以才会弹出默认的系统打印窗口。按下面的步骤调整就能实现全流程静默打印:
- 换掉打印的执行入口,别再用
PrintDialog的方法发请求
很多开发者以为只要不调dlg.ShowDialog()就不会弹配置窗,其实就算不弹配置窗,用dlg.PrintDocument发出去的打印请求,还是会触发Windows自带的打印进度弹窗。直接用XpsDocumentWriter对接底层打印API发起任务,从根上绕开PrintDialog的内置UI逻辑就好。 - 绑定好固定的目标打印机
用LocalPrintServer拿到你实际要使用的打印机实例,别用系统的动态打印机选择逻辑,代码参考:
// 初始化本地打印服务,不挂载任何UI组件 var printServer = new LocalPrintServer(); // 替换为你实际使用的打印机名称,比如热敏小票机的设备名 var targetQueue = printServer.GetPrintQueue("你的目标打印机名称"); // 直接从打印队列创建XPS写入器,不经过PrintDialog中转 var printWriter = PrintQueue.CreateXpsDocumentWriter(targetQueue);
- 屏蔽系统层面的打印进度弹窗
就算绕开了WPF的PrintDialog,Windows默认还是会弹出小窗口显示打印进度,需要在提交打印任务前修改目标打印队列的属性,把这些通知关掉:
// 关闭打印任务的进度、完成状态的系统弹窗 targetQueue.QueueAttributes = PrintQueueAttributes.EnableBIDI | PrintQueueAttributes.KeepPrintedJobs;
- 替换原来的打印提交代码
你原来准备FlowDocument的逻辑完全可以保留,只要把最后dlg.PrintDocument(...)那行换成直接调用写入器提交内容就行:
// 原有的FlowDocument准备逻辑,和你之前写的实现完全一致 var doc = new FlowDocument { PageWidth = 275, FontSize = 18, TextAlignment = TextAlignment.Center }; doc.Blocks.Add(new Paragraph(new Run("nXXXXXXXXXXXX"))); // 直接把文档内容提交到目标打印机队列 printWriter.Write(((IDocumentPaginatorSource)doc).DocumentPaginator);
实际开发中容易踩的坑:
- 要是你确实需要保留
PrintDialog的实例也没关系,只要不调它的弹窗方法、不拿它发打印请求,就不会触发任何UI;如果根本不需要用户选打印机配置,直接把原来的dlg相关声明删掉就行。- 别图省事还是用
dlg.PrintDocument发请求,哪怕你提前给dlg设好了目标打印机,这个方法内部的逻辑还是会触发系统弹窗,因为它没有做屏蔽通知的处理。- 要是想用系统默认打印机当目标,直接用
printServer.DefaultPrintQueue获取队列实例就行,完全不需要弹出选择窗口。
内容的提问来源于stack exchange,提问作者Mini
相关产品推荐
相关产品推荐

