How to delete all Print Jobs from a print queue
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
1 week 5 days ago
1 week 5 days ago
2 weeks 2 hours ago
2 weeks 1 day ago
2 weeks 2 days ago
2 weeks 5 days ago
3 weeks 5 days ago
3 weeks 6 days ago
4 weeks 14 hours ago
4 weeks 4 days ago