private static bool GetPrinterInfo2(string printerName, out int cJobs, out int status) { SafePrinterHandle printer = null; try { int needed = 0; if (OpenPrinter(printerName, out printer, IntPtr.Zero) && !GetPrinter(printer, 2, IntPtr.Zero, 0, out needed)) { int lastWin32Error = Marshal.GetLastWin32Error(); if (lastWin32Error == ERROR_INSUFFICIENT_BUFFER) { IntPtr pPrinter = Marshal.AllocHGlobal((int)needed); try { if (GetPrinter(printer, 2, pPrinter, needed, out needed)) { PRINTER_INFO_2 printerInfo2 = (PRINTER_INFO_2)Marshal.PtrToStructure(pPrinter, typeof(PRINTER_INFO_2)); cJobs = printerInfo2.cJobs; status = printerInfo2.Status; return(true); } } finally { Marshal.FreeHGlobal(pPrinter); } } } } finally { if (printer != null) { printer.Close(); } } cJobs = 0; status = 0; return(false); }
private static extern bool OpenPrinter(string pPrinterName, out SafePrinterHandle hPrinter, IntPtr pDefault);
private static extern bool GetPrinter(SafePrinterHandle hPrinter, int dwLevel, IntPtr pPrinter, int cbBuf, out int pcbNeeded);