in my application (Windows 7, VS2010) i have to decrement a credit counter after successfully printing an image. Anyway, before starting the entire process, i\'d like to kno
The PrintQueue class in the System.Printing namespace is what you are after. It has many properties that give useful information about the status of the printer that it represents. Here are some examples;
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;
This is by no means a comprehensive list and remember that it is possible for the queue to have one or more of these statuses so you'll have to think about the order in which you handle them.
The only solution that is reliable across all brands of printers is to use SNMP to query the number of pages printed and ensure that it matches the number of pages in the document sent.
SNMP OID for page count is 1.3.6.1.2.1.43.10.2.1.4
From my testing, every other strategy has had unreliable behavior (odd null reference exceptions when fetching the print queue repeatedly) or provided inaccurate status codes or page counts.
You can do this with printer queues as @mark_h pointed out above.
However, if your printer is not the default printer you need to load that printer's queue instead. What you need to do instead of calling server.DefaultPrintQueue
you would need to load the correct queue by calling GetPrintQueue()
then pass it the printer name and an empty string array.
//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;
You don't say what version of .Net you're using, but since .Net 3.0 there has been some good printing functionality. I've used this and whilst I can't be sure that it reports all kinds of status levels, I've certainly seen messages such as 'Toner Low' for various printers etc.
PrinterDescription is a custom class, but you can see the properties its using.
http://msdn.microsoft.com/en-us/library/system.printing.aspx
PrintQueueCollection printQueues = null;
List<PrinterDescription> printerDescriptions = null;
// Get a list of available printers.
this.printServer = new PrintServer();
printQueues = this.printServer.GetPrintQueues(new[] { EnumeratedPrintQueueTypes.Local, EnumeratedPrintQueueTypes.Connections });
printerDescriptions = new List<PrinterDescription>();
foreach (PrintQueue printQueue in printQueues)
{
// The OneNote printer driver causes crashes in 64bit OSes so for now just don't include it.
// Also redirected printer drivers cause crashes for some printers. Another WPF issue that cannot be worked around.
if (printQueue.Name.ToUpperInvariant().Contains("ONENOTE") || printQueue.Name.ToUpperInvariant().Contains("REDIRECTED"))
{
continue;
}
string status = printQueue.QueueStatus.ToString();
try
{
PrinterDescription printerDescription = new PrinterDescription()
{
Name = printQueue.Name,
FullName = printQueue.FullName,
Status = status == Strings.Printing_PrinterStatus_NoneTxt ? Strings.Printing_PrinterStatus_ReadyTxt : status,
ClientPrintSchemaVersion = printQueue.ClientPrintSchemaVersion,
DefaultPrintTicket = printQueue.DefaultPrintTicket,
PrintCapabilities = printQueue.GetPrintCapabilities(),
PrintQueue = printQueue
};
printerDescriptions.Add(printerDescription);
}
catch (PrintQueueException ex)
{
// ... Logging removed
}
}