WPF打印作业监控报错:System.Printing.PrintJobException参数不正确
打印作业监控WPF项目中
Pause()报错的解决方法 问题背景
开发打印作业监控应用,对应的WinForms示例功能正常,但移植到WPF项目后,调用PrintSystemJobInfo.Pause()时抛出错误:
System.Printing.PrintJobException: 设置打印作业时发生异常。Win32错误: 参数不正确。
出错代码片段:
void pqm_OnJobStatusChange(object Sender, PrintJobChangeEventArgs e) { try { PrintSystemJobInfo job = e.JobInfo; if (job == null) return; if (job.IsSpooling) { job.Pause(); // 此处报错 } else if (job.IsPaused) { PrintQueue pq = job.HostingPrintQueue; pq.Refresh(); if (JobDetails(printer, e.JobID)) { job.Resume(); } else { job.Cancel(); } } } catch (Exception ex) { MessageBox.Show(ex.Message); } }
解决办法
1. 重新获取打印作业对象
WPF中事件参数传递的e.JobInfo可能因对象状态过期或上下文问题导致操作失败,改为从打印队列重新获取作业实例:
void pqm_OnJobStatusChange(object Sender, PrintJobChangeEventArgs e) { try { PrintQueue pq = Sender as PrintQueue; if(pq == null) return; // 从队列重新获取作业,确保状态最新 PrintSystemJobInfo job = pq.GetJob(e.JobID); if (job == null) return; if (job.IsSpooling) { job.Pause(); } else if (job.IsPaused) { pq.Refresh(); if (JobDetails(printer, e.JobID)) { job.Resume(); } else { job.Cancel(); } } } catch (Exception ex) { MessageBox.Show(ex.Message); } }
2. 检查权限
确保应用拥有操作打印作业的足够权限,可尝试以管理员身份运行WPF应用测试。
3. 强制刷新打印队列
在获取作业前调用PrintQueue.Refresh(),保证队列和作业状态是最新的:
pq.Refresh(); PrintSystemJobInfo job = pq.GetJob(e.JobID);
内容的提问来源于stack exchange,提问作者SoftSol
相关产品推荐
相关产品推荐

