Search code examples
c#printingsystem.drawingsystem.management

Using System.Drawing.Printing to get Queue Status


I've been trying to use System.Drawing.Printing; in order to get the queue status of a network printer.

I can retrieve the properties of the printer but I can't really seem to get the queue status.

This is what I've tried so far:

PrinterSettings ps = new PrinterSettings();
ps.PrinterName = "ES5461 MFP(PCL)"; // Load the appropriate printer's setting

From there I can see that the Printer is valid since ps.IsValid is true but I can't go any further.

I've tried as well to use System.Management to retrieve the status but I just know how to dump the information and there's no queue information as well.

string printerName = "ES5461";
string query = string.Format("SELECT * from Win32_Printer WHERE Name LIKE '%{0}%'", printerName);

ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
ManagementObjectCollection coll = searcher.Get();

foreach (ManagementObject printer in coll)
{
    foreach (PropertyData property in printer.Properties)
    {
        Console.WriteLine(string.Format("{0}: {1}", property.Name, property.Value));
    }
}

Do you know of any way to retrieve the queue status (number of documents) using any .dll?


Solution

  • Thanks to Nissim I could solve it:

    var printServer = new PrintServer();
    var myPrintQueues = printServer.GetPrintQueues(new[] { EnumeratedPrintQueueTypes.Local, EnumeratedPrintQueueTypes.Connections });
    
    foreach (PrintQueue pq in myPrintQueues)
    {
        pq.Refresh();
        if (!pq.Name.ToLower().Contains("es5461")) continue;  
        PrintJobInfoCollection jobs = pq.GetPrintJobInfoCollection();
        foreach (PrintSystemJobInfo job in jobs)
        {
            var aux = job;
        }// end for each print job    
    }// end for each print queue
    

    As you can see using the PrintServer (System.Printing) combined with the PrintQueue as suggested by Nissim I can actually access to the queue information.