How to delete all Print Jobs from a print queue
By Sergey - Posted on May 8th, 2008
All jobs from a print queue can be deleted with
- WMI Win32_Printer class and CancelAllJobs method
- Windows API SetPrinter function.
A specific print job can be deleted by SetJob function.
The following code has been tested under Windows XP. The Windows API version may work under earlier Windows versions.
| This is sample code. Add error handling and adjust to your requirements as necessary. |
&& WMI lcPrintername = GETPRINTER() IF NOT EMPTY(lcPrintername) IF ClearPrintQueue(lcPrintername) ? "The print queue has been successfully cleared" ELSE ? "Error" ENDIF ENDIF RETURN &&-------------------------------------------------------------------- FUNCTION ClearPrintQueue(tcPrinterName) LOCAL lcPrinterName, loWMI, loPrinters, loPrinter, loErr, loLocator loLocator = CREATEOBJECT('WBEMScripting.SWBEMLocator') loWMI = loLocator.ConnectServer() loWMI.Security_.ImpersonationLevel = 3 && Impersonate lcPrinterName = STRTRAN(tcPrinterName , "\", "\\") loPrinters = loWMI.ExecQuery("Select * from Win32_Printer " + ; " WHERE Name = '" + lcPrinterName + "'") llOK = .T. TRY FOR EACH loPrinter in loPrinters loPrinter.CancelAllJobs() ENDFOR CATCH TO loErr ? loErr.Errorno, loErr.Message llOK = .F. ENDTRY RETURN llOK
The WinApiErrMsg function in the code below is from Retrieving Windows system error message.
&& Windows API lcPrintername = GETPRINTER() IF NOT EMPTY(lcPrintername) IF ClearPrintQueue(lcPrintername) ? "The print queue has been successfully cleared" ELSE ? "Error" ENDIF ENDIF RETURN &&-------------------------------------------------------------------- FUNCTION ClearPrintQueue(tcPrinterName) LOCAL lcErrorTxt, lnHandle, lcBuffer, lcPrDef, llOK DECLARE Long GetLastError IN kernel32.dll #DEFINE PRINTER_CONTROL_PURGE 3 #DEFINE PRINTER_ACCESS_ADMINISTER 4 lcCrLf = CHR(13) + CHR(10) lcTab = CHR(9) lnHandle = 0 && Open a Pinter with proper access rights lcPrDef = REPLICATE(CHR(0),8) + CHR(PRINTER_ACCESS_ADMINISTER) + REPLICATE(CHR(0),3) llOK = OpenPrinter( tcPrinterName, @lnHandle, lcPrDef) <> 0 IF NOT llOK THEN lcErrorTxt = WinApiErrMsg(GetLastError()) ? "Cannot Open Printer " + tcPrinterName + lcCrLf + lcTab + lcErrorTxt RETURN llOK ENDIF && Clear Print Queueu llOK = SetPrinter( lnHandle, 0, 0, PRINTER_CONTROL_PURGE) <> 0 IF NOT llOK THEN lcErrorTxt = WinApiErrMsg(GetLastError()) = ClosePrinter( lnHandle ) ? "Error Clearing Print Queue for " + tcPrinterName + lcCrLf + lcTab + lcErrorTxt RETURN llOK ENDIF = ClosePrinter( lnHandle ) RETURN llOK &&--------------------------------------------------------------- FUNCTION OpenPrinter(tcPrinterName, thPrinter, tcDefault) DECLARE Long OpenPrinter IN WinSpool.Drv ; String pPrinterName, Long@ phPrinter, String pDefault RETURN OpenPrinter(tcPrinterName, @thPrinter, tcDefault) FUNCTION ClosePrinter (thPrinter) DECLARE Long ClosePrinter IN WinSpool.Drv Long hPrinter RETURN ClosePrinter(thPrinter) FUNCTION SetPrinter(thPrinter, tnLevel, tnPrinter, tnCommand) DECLARE Long SetPrinter IN WinSpool.Drv; Long hPrinter, Long Level, Long pPrinter, Long Command RETURN SetPrinter(thPrinter, tnLevel, tnPrinter, tnCommand)
Recent comments
2 weeks 1 day ago
2 weeks 1 day ago
2 weeks 1 day ago
5 weeks 1 day ago
9 weeks 6 days ago
9 weeks 6 days ago
10 weeks 4 days ago
11 weeks 3 days ago
12 weeks 6 days ago
12 weeks 6 days ago