Wpf System.Printing.PrintQueue队列状态未更新

Wpf System.Printing.PrintQueue队列状态未更新,wpf,printing,system.printing,printqueue,Wpf,Printing,System.printing,Printqueue,是否有方法更新对象中包含的打印队列状态信息 我试着调用该对象,但实际上没有任何作用。例如,我关闭了打印机,控制面板正确地将打印机显示为“脱机”,但是属性以及Isofline属性没有反映这一点-无论我在和相关的上调用刷新多少次 我已经看到了如何使用WMI查询获取状态信息的示例,但我想知道——因为这些属性在对象上可用——是否有任何方法可以使用这些属性。尝试打印打印文档(System.Drawing.Printing)后,试着检查打印作业的状态 第一步: 初始化打印文档 第二步: 从System.Dr

是否有方法更新对象中包含的打印队列状态信息

我试着调用该对象,但实际上没有任何作用。例如,我关闭了打印机,控制面板正确地将打印机显示为“脱机”,但是属性以及Isofline属性没有反映这一点-无论我在和相关的上调用刷新多少次


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

尝试打印打印文档(System.Drawing.Printing)后,试着检查打印作业的状态

第一步: 初始化打印文档

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

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

第三步: 尝试打印和处理

printerDocument.Print();
printerDocument.Dispose();
最后一步:在任务中运行签入(不要阻止UI线程)

以下是实施方案:

        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;    
        }
private bool-IsPrinterOk(字符串名,int-checkTimeInMillisec)
{
System.Collections.IList值=null;
做
{
//CheckTimeIn毫秒应介于2000和5000之间
系统线程线程睡眠(检查时间毫秒);
使用(System.Management.ManagementObjectSearcher search=new System.Management.ManagementObjectSearcher(“从Win32中选择*,其中名称类似“%”+名称+“%””)
{
值=空;
if(searcher.Get().Count==0)//挂起文档的数量。
return true;//返回,因为我们没有任何挂起的文档。
其他的
{
foreach(searcher.Get()中的System.Management.ManagementObject打印机)
{
value=printer.Properties.Cast().Where(p=>p.Name.Equals(“Status”)).Select(p=>p.value.ToList();
打破
}
}
}
}
while(value.Contains(“打印”)| | value.Contains(“未知”)| | value.Contains(“确定”);
返回值。包含(“错误”)?false:true;
}

祝你好运。

这与WPF有什么关系?您好,您找到解决此问题的方法了吗?我也面临着同样的问题。@rem-不,不幸的是,我找不到让这些属性正常工作的方法。最后我放弃了这个想法,因为在我的应用程序中显示打印机的状态是不值得的。如果你找到了答案,请把它贴在这里!好的,米奇,谢谢你让我知道!问题是关于新System.Printing.PrintQueue对象的。你的答案是关于旧系统的。绘图。打印。。。物体。我很感谢您花时间在这里添加它,但它没有回答问题。我也尝试使用PrintQueue。您可以对printQueue实例(在尝试打印之后)执行相同的操作(在一个周期内)。您可以获取pq.QueueStatus,打印失败后,它将返回PrintQueueStatus.Error值。我也试过这个方法。但我的经验表明,我的答案比
printQueue.QueueStatus
更可靠,所以在获得打印队列的状态之前,您必须实际尝试打印一些内容?这对用户来说是个很大的问题,你不觉得吗?或者我读错了吗?是的,在获取printerQueue的队列状态之前,您必须尝试打印一些内容,是的,这不是我能想象到的最好的解决方案,但它可以工作,至少在打印失败后它会返回错误值,并且可以从响应中推断打印机不可用。我同意,在脱机打印机的情况下,它可以工作,但在打印机联机时,它会不断向打印机打印某些内容只是不好的用户体验——事实上,我宁愿不显示状态,也不愿向所有打印机发送打印作业来确定它们的状态。你不同意吗?
        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;    
        }