首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >System.Printing.PrintQueue QueueStatus未更新

System.Printing.PrintQueue QueueStatus未更新
EN

Stack Overflow用户
提问于 2010-11-24 07:10:48
回答 1查看 2K关注 0票数 5

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

我尝试过在PrintQueue对象上调用Refresh,但这实际上并不起什么作用。例如,我关闭了打印机,控制面板正确地将打印机显示为“脱机”,但是QueueStatus属性和IsOffline属性不会反映这一点--无论我在PrintServerPrintQueue上调用Refresh多少次。

我见过如何使用WMI查询获取状态信息的示例,但我想知道--既然这些属性在PrintQueue对象上可用--是否有任何方法可以使用它们。

EN

回答 1

Stack Overflow用户

发布于 2016-12-01 05:34:23

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

第一步:初始化printDocument。

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

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

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

代码语言:javascript
复制
printerDocument.Print();
printerDocument.Dispose();

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

代码语言:javascript
复制
   Task.Run(()=>{
     if (!IsPrinterOk(printerDocument.PrinterSettings.PrinterName,checkTimeInMillisec))
     {
        // failed printing, do something...
     }
    });

具体实现如下:

代码语言:javascript
复制
        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;    
        }

祝好运。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4261984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档