Enumerate the printer jobs. (EnumJobs example)  

Send By: Radikal (Q3 Team)
Web : http://www.q3.nu
Email: radikal@q3.nu
Date: 18/12/02

Tip accessed 640 times

 


Put a TMemo (Memo1) and a TButton (Button1) in your form
Add Printers and Winspool in the uses of the form
Put this in the OnClick event of Button1:

 procedure TForm1.Button1Click(Sender: TObject);

   Function AbreImpresoraPorDefecto: THandle;
   const
     Defaults:
       TPrinterDefaults = ( pDatatype : nil;
                            pDevMode  : nil;
                            DesiredAccess : PRINTER_ACCESS_USE or PRINTER_ACCESS_ADMINISTER );
   var
     Device, Driver, Port : array[0..255] of char;
     hDeviceMode: THandle;
   begin
     Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
     if not OpenPrinter(@Device, Result, @Defaults) then RaiseLastWin32Error;
   end;

 type
   TTrabajos = array [0..9000] of JOB_INFO_1;
   PTrabajos = ^TTrabajos;

 var


     MangoPrinter      : Thandle;
     PTrabajo          : PTrabajos;
     BytesRecibidos    : DWord;
     TrabajosRecibidos : DWord;
     i                 : integer;
 begin
    MangoPrinter:=AbreImpresoraPorDefecto;
    try
      {Hallamos cuantos bytes ocupara la enumeracion de trabajos}
      EnumJobs( MangoPrinter,0,9000,1,Nil,0,
                BytesRecibidos,
                TrabajosRecibidos );

      {Reservamos memoria para la respuesta}
      PTrabajo := AllocMem( BytesRecibidos );
      try
        {Enumeramos los trabajos}
        if NOT EnumJobs( MangoPrinter,
                  0,           //Empezando por el primero
                  9000,        //Numero de jobs a enumerar
                  1,
                  PTrabajo,
                  BytesRecibidos,
                  BytesRecibidos,
                  TrabajosRecibidos) then RaiseLastWin32Error;

        Memo1.Lines.Clear;
        Memo1.Lines.Add('Trabajos: '+IntToStr(TrabajosRecibidos) );

        {Llenamos el Memo1 con datos de los trabajos}
        for i:= 0 to Pred(TrabajosRecibidos) do
          memo1.lines.add( PTrabajo^[i].pDocument    +' - '+
                           PTrabajo^[i].pMachineName +' - '+
                           IntToStr( PTrabajo^[i].TotalPages )
                          );
      finally
        {Liberamos la memoria usada en la respuesta}
        FreeMem( PTrabajo );
      end;
    finally
      {Cerramos la impresora}
      ClosePrinter(MangoPrinter);
    end;
 end;



And you can see the pending jobs of the printer.
The structure has several members for you use:

 typedef struct _JOB_INFO_1 {    // ji1
     DWORD  JobId;
     LPTSTR pPrinterName;
     LPTSTR pMachineName;
     LPTSTR pUserName;
     LPTSTR pDocument;
     LPTSTR pDatatype;
     LPTSTR pStatus;
     DWORD  Status;
     DWORD  Priority;
     DWORD  Position;
     DWORD  TotalPages;
     DWORD  PagesPrinted;
     SYSTEMTIME Submitted;
 } JOB_INFO_1;




[387] - Detectar un cambio en los ficheros de un directorio