System.Printing.PrintQueue QueueStatus 未更新

Posted

技术标签:

【中文标题】System.Printing.PrintQueue QueueStatus 未更新【英文标题】:System.Printing.PrintQueue QueueStatus not updating 【发布时间】:2010-11-23 23:10:48 【问题描述】:

有没有办法更新PrintQueue对象中包含的打印队列状态信息?

我尝试在PrintQueue 对象上调用Refresh,但这并没有真正起到任何作用。例如,我关闭了打印机,并且控制面板正确地将打印机显示为“脱机”,但是 QueueStatus 属性以及 IsOffline 属性并没有反映出这一点——无论我调用了多少次 Refresh在有问题的PrintServer 和PrintQueue 上。

我已经看到了如何使用 WMI 查询获取状态信息的示例,但我想知道 - 因为这些属性在 PrintQueue 对象上可用 - 是否有任何方法可以使用它们。

【问题讨论】:

这个 WPF 有什么关系? 您好,您找到解决此问题的方法了吗?我也遇到过。 @rem - 不,不幸的是我找不到让这些属性工作的方法。最后我放弃了整个想法,因为仅仅在我的应用程序中显示打印机的状态是不值得的。如果您确实找到了答案,请在此处发布! 好的,Miky,谢谢你的告知! 【参考方案1】:

尝试打印您的 PrintDocument (System.Drawing.Printing) 后,尝试检查打印作业的状态。

第一步: 初始化您的 printDocument。

第二步: 从System.Drawing.Printing.PrinterSettings.InstalledPrinters.Cast<string>();获取您的打印机名称

并将其复制到您的printerDocument.PrinterSettings.PrinterName

第三步: 尝试打印和处理。

printerDocument.Print();
printerDocument.Dispose();

最后一步:在任务中运行检查(不要阻塞 UI 线程)。

   Task.Run(()=>
     if (!IsPrinterOk(printerDocument.PrinterSettings.PrinterName,checkTimeInMillisec))
     
        // failed printing, do something...
     
    );

这里是实现:

        private bool IsPrinterOk(string name,int checkTimeInMillisec)
        
            System.Collections.IList value = null;
            do
            
                //checkTimeInMillisec should be between 2000 and 5000
                System.Threading.Thread.Sleep(checkTimeInMillisec);

                using (System.Management.ManagementObjectSearcher searcher = new System.Management.ManagementObjectSearcher("SELECT * FROM Win32_PrintJob WHERE Name like '%" + name + "%'"))
                
                    value = null;

                    if (searcher.Get().Count == 0) // Number of pending document.
                        return true; // return because we haven't got any pending document.
                    else
                    
                        foreach (System.Management.ManagementObject printer in searcher.Get())
                        
                            value = printer.Properties.Cast<System.Management.PropertyData>().Where(p => p.Name.Equals("Status")).Select(p => p.Value).ToList();
                            break; 
                        
                    
                
           
           while (value.Contains("Printing") || value.Contains("UNKNOWN") || value.Contains("OK"));

           return value.Contains("Error") ? false : true;    
        

祝你好运。

【讨论】:

问题是关于新的 System.Printing.PrintQueue 对象。您的答案是关于旧的 System.Drawing.Printing... 对象。感谢您花时间在此处添加它,但它没有回答问题。 我也尝试使用 PrintQueue。您可以对您的 printQueue 实例(在尝试打印之后)执行相同的操作(在一个循环中)。您可以获得 pq.QueueStatus ,打印失败后它将返回 PrintQueueStatus.Error 值。我也试过这个方法。但是我经历过我的答案比printQueue.QueueStatus更可靠的解决方案@ 所以您必须实际尝试打印一些东西才能获得打印队列的状态?这对用户来说是相当有问题的,你不觉得吗?还是我看错了? 是的,您必须先尝试打印一些东西,然后才能获得打印机队列的 QueueStatus,是的,这不是我能想象的最好的解决方案,但它可以工作,至少它会返回打印不成功后的错误值,可以从响应中推断出打印机不可用。 我同意在离线打印机的情况下它会工作,但在打印机在线不断打印某些东西的情况下,它只是不好的用户体验 - 事实上我宁愿不显示状态而不是虚假地将打印作业发送到所有打印机以确定它们的状态。你不同意吗?

以上是关于System.Printing.PrintQueue QueueStatus 未更新的主要内容,如果未能解决你的问题,请参考以下文章