VB.NET打印完成后切换默认打印机及双打印机同步打印问题咨询
问题1解答
完全可以实现同时给两台打印机发送不同的打印任务,不需要修改系统默认打印机,也不需要等待前一个任务完成:
PrintDocument本身支持通过PrinterSettings.PrinterName属性直接指定目标打印机,不需要修改系统全局默认打印机,你现有代码里给PrintDocument_BO.PrinterSettings.PrinterName赋值Printer1的逻辑本身就是对的,不需要额外调用SetDefaultPrinter修改系统默认。- 网页打印任务也可以单独指定目标打印机:不管你是用
WebBrowser控件、Edge WebView2还是其他网页打印组件,都支持在打印参数里指定打印机2的名称,不需要依赖系统默认打印机配置。 - 两个打印任务完全独立,可以先后或者同时发送,不会出现打印到错误打印机的问题。
问题2解答
你现有等待逻辑失效主要是两个原因:
- 打印任务提交后,系统假脱机服务需要一定时间把任务加入打印队列,你直接开始判断队列任务数量,很可能任务还没进队列就被判定为队列无任务,跳过了等待逻辑。
- 等待循环没有加延时,高频刷新会导致状态更新不及时,同时你只遍历了第一次获取到的任务列表,如果后续有新任务进队列不会被纳入等待范围。
如果确实需要等待打印机1的所有任务完成再执行后续操作,可按如下方式调整逻辑:
<DllImport("winspool.drv", CharSet:=CharSet.Auto, SetLastError:=True)> Public Shared Function SetDefaultPrinter(name As String) As Boolean End Function ' 给PrintDocument指定打印机1,不需要改系统默认 PrintDocument_BO.PrinterSettings.PrinterName = Printer1 ' 提交打印任务(你原有提交打印的代码写在这里) PrintDocument_BO.Print() ' 等待假脱机队列接收任务,可根据实际情况调整延时 Threading.Thread.Sleep(200) ' 等待所有任务完成,增加超时避免死锁 Dim timeout As DateTime = DateTime.Now.AddSeconds(30) ' 最多等待30秒 While DateTime.Now < timeout pq.Refresh() If pq.NumberOfJobs = 0 Then Exit While End If ' 遍历所有当前任务检查状态 Dim allCompleted As Boolean = True For Each job In pq.GetPrintJobInfoCollection() job.Refresh() If Not (job.IsCompleted OrElse job.IsDeleted OrElse job.IsPrinted) Then allCompleted = False Exit For End If Next If allCompleted Then Exit While End If ' 每次判断间隔100ms,降低CPU占用 Threading.Thread.Sleep(100) End While ' 网页打印直接指定打印机2即可,不需要改系统默认 ' 如果你一定要修改默认打印机再打印,再在这里调用SetDefaultPrinter
内容的提问来源于stack exchange,提问作者Desz
相关产品推荐
相关产品推荐

