Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#检查打印机状态_C#_Printing_Status - Fatal编程技术网

c#检查打印机状态

c#检查打印机状态,c#,printing,status,C#,Printing,Status,在我的应用程序(Windows7,VS2010)中,成功打印图像后,我必须减少信用计数器。 无论如何,在开始整个过程之前,我想知道打印机的状态,以便提醒用户出纸、卡纸等情况。 现在,环顾四周,我发现了几个使用Windows WMI的示例,但是。。。从来都不管用。例如,使用snippet,打印机状态始终为就绪。如果我取出纸张,打开封面。。。关掉打印机 打印机的状态现在也一直很好,我正在办公室测试一台在家里可以轻松关闭的打印机。 我必须用炸药引爆设备,才能获得打印机错误状态吗 这是我用过的代码 Ma

在我的应用程序(Windows7,VS2010)中,成功打印图像后,我必须减少信用计数器。 无论如何,在开始整个过程之前,我想知道打印机的状态,以便提醒用户出纸、卡纸等情况。 现在,环顾四周,我发现了几个使用Windows WMI的示例,但是。。。从来都不管用。例如,使用snippet,打印机状态始终为就绪。如果我取出纸张,打开封面。。。关掉打印机

打印机的状态现在也一直很好,我正在办公室测试一台在家里可以轻松关闭的打印机。 我必须用炸药引爆设备,才能获得打印机错误状态吗

这是我用过的代码

ManagementObjectCollection MgmtCollection;
ManagementObjectSearcher MgmtSearcher;

//Perform the search for printers and return the listing as a collection
MgmtSearcher = new ManagementObjectSearcher("Select * from Win32_Printer");
MgmtCollection = MgmtSearcher.Get();

foreach (ManagementObject objWMI in MgmtCollection)
{

    string name = objWMI["Name"].ToString().ToLower();

    if (name.Equals(printerName.ToLower()))
    {

        int state = Int32.Parse(objWMI["ExtendedPrinterStatus"].ToString());
        if ((state == 1) || //Other
        (state == 2) || //Unknown
        (state == 7) || //Offline
        (state == 9) || //error
        (state == 11) //Not Available
        )
        {
        throw new ApplicationException("hope you are finally offline");
        }

        state = Int32.Parse(objWMI["DetectedErrorState"].ToString());
        if (state != 2) //No error
        {
        throw new ApplicationException("hope you are finally offline");
        }

    }

}
其中“printerName”作为参数接收


谢谢你的建议。

你没有说你使用的是什么版本的.Net,但是自从.Net 3.0以来,已经有了一些很好的打印功能。我用过这个,虽然我不能确定它报告了各种状态级别,但我确实看到了各种打印机的“碳粉不足”等消息

PrinterDescription是一个自定义类,但是您可以看到它使用的属性

PrintQueueCollection printQueues=null;
列表printerDescriptions=null;
//获取可用打印机的列表。
this.printServer=新的printServer();
printQueues=this.printServer.GetPrintQueues(新[]{EnumeratedPrintQueueTypes.Local,EnumeratedPrintQueueTypes.Connections});
printerDescriptions=新列表();
foreach(PrintQueue中的PrintQueue PrintQueue)
{
//OneNote打印机驱动程序会在64位操作系统中导致崩溃,因此暂时不包括它。
//另外,重定向的打印机驱动程序会导致某些打印机崩溃。另一个无法解决的WPF问题。
if(printQueue.Name.ToUpperInvariant().Contains(“ONENOTE”)| | printQueue.Name.ToUpperInvariant().Contains(“重定向”))
{
继续;
}
字符串状态=printQueue.QueueStatus.ToString();
尝试
{
PrinterDescription PrinterDescription=新的PrinterDescription()
{
Name=printQueue.Name,
FullName=printQueue.FullName,
Status=Status==Strings.Printing\u PrinterStatus\u NoneTxt?Strings.Printing\u PrinterStatus\u readyText:Status,
ClientPrintSchemaVersion=printQueue.ClientPrintSchemaVersion,
DefaultPrintTicket=printQueue.DefaultPrintTicket,
PrintCapabilities=printQueue.GetPrintCapabilities(),
PrintQueue=PrintQueue
};
printerDescription.Add(printerDescription);
}
捕获(PrintQueueException ex)
{
//…日志记录已删除
}
}

在所有品牌的打印机中唯一可靠的解决方案是使用SNMP查询打印的页数,并确保它与发送的文档中的页数匹配

页面计数的SNMP OID为1.3.6.1.2.1.43.10.2.1.4

根据我的测试,其他所有策略都有不可靠的行为(重复获取打印队列时出现奇数null引用异常),或者提供了不准确的状态代码或页面计数。

命名空间中的类就是您要找的。它有许多属性,可以提供有关它所代表的打印机状态的有用信息。这里有一些例子

        var server = new LocalPrintServer();

        PrintQueue queue = server.DefaultPrintQueue;

        //various properties of printQueue
        var isOffLine = queue.IsOffline;
        var isPaperJam = queue.IsPaperJammed;
        var requiresUser = queue.NeedUserIntervention;
        var hasPaperProblem = queue.HasPaperProblem;
        var isBusy = queue.IsBusy;

这绝不是一个全面的列表,请记住,队列可能有一个或多个这些状态,因此您必须考虑处理它们的顺序。

您可以使用上面指出的打印机队列来执行此操作

但是,如果您的打印机不是默认打印机,则需要加载该打印机的队列。您需要做什么来代替调用
server.DefaultPrintQueue
您需要通过调用
GetPrintQueue()
来加载正确的队列,然后将打印机名称和空字符串数组传递给它

//Get local print server
var server = new LocalPrintServer();

//Load queue for correct printer
PrintQueue queue = server.GetPrintQueue(PrinterName, new string[0] { }); 

//Check some properties of printQueue    
bool isInError = queue.IsInError;
bool isOutOfPaper = queue.IsOutOfPaper;
bool isOffline = queue.IsOffline;
bool isBusy = queue.IsBusy;

当您确实发现一些有用的东西时,请记住,您必须处理打印时出现的任何或所有这些情况-炸药可能会在检查状态和实际启动打印作业之间爆炸。可能是WMI造成的。大多数打印机驱动程序无法正确更新打印机状态,WMI无法选择。我们曾多次遇到过这样的问题,你在看什么打印机?@Mubashir Khan:你说得对。如果打印机驱动程序绕过后台打印程序进程以获取状态,或者如果它根本没有向后台打印程序报告状态,则WMI在从后台打印程序进程检索打印机时无法告知打印机的实际状态。有关更多详细信息:如果我将一个页面从控制台应用程序直接打印到打印机上(使用process with verb=“print”并向其馈送.pdf文件);是否可以跟踪打印队列作为-文档是否成功打印?(对于特定文档?)我使用.Net 4.5,在.Net 4.5中不可用。您只读取默认打印机。一个系统可以安装多台打印机,每台打印机都有自己的队列和状态
//Get local print server
var server = new LocalPrintServer();

//Load queue for correct printer
PrintQueue queue = server.GetPrintQueue(PrinterName, new string[0] { }); 

//Check some properties of printQueue    
bool isInError = queue.IsInError;
bool isOutOfPaper = queue.IsOutOfPaper;
bool isOffline = queue.IsOffline;
bool isBusy = queue.IsBusy;