You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET打印完成后切换默认打印机及双打印机同步打印问题咨询

问题1解答

完全可以实现同时给两台打印机发送不同的打印任务,不需要修改系统默认打印机,也不需要等待前一个任务完成:

  • PrintDocument 本身支持通过 PrinterSettings.PrinterName 属性直接指定目标打印机,不需要修改系统全局默认打印机,你现有代码里给PrintDocument_BO.PrinterSettings.PrinterName赋值Printer1的逻辑本身就是对的,不需要额外调用SetDefaultPrinter修改系统默认。
  • 网页打印任务也可以单独指定目标打印机:不管你是用WebBrowser控件、Edge WebView2还是其他网页打印组件,都支持在打印参数里指定打印机2的名称,不需要依赖系统默认打印机配置。
  • 两个打印任务完全独立,可以先后或者同时发送,不会出现打印到错误打印机的问题。

问题2解答

你现有等待逻辑失效主要是两个原因:

  1. 打印任务提交后,系统假脱机服务需要一定时间把任务加入打印队列,你直接开始判断队列任务数量,很可能任务还没进队列就被判定为队列无任务,跳过了等待逻辑。
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 17:39:03