Impressao - listando a fila de impressao do windows

Top  Previous  Next

// With Windows it is very easy to monitor the printed jobs.  

// But sometimes and for a good reason the user need to monitor those jobs 

// from inside the application.  

// How?  The answer is using the "EnumJobs" Windows API to retrieve the 

// information (Job Name-Status-date-time...etc).  T

// To simplify the use of this Windows API I developed an easy 

// function that receive the printer name and return an array of a structure, 

// which represent the information needed.  Here is the code for this function: 

 

uses WinSpool; 

………………….. 

type JOB_INFO_1_ARRAY = Array of JOB_INFO_1; 

………………….. 

Function GetSpoolerJobs(sPrinterName : String) : JOB_INFO_1_ARRAY; 

var 

         i : Integer; 

         hPrinter   : THandle; 

         bResult    : Boolean; 

         cbBuf      : DWORD; 

         pcbNeeded  : DWORD; 

         pcReturned : DWORD; 

         aJobs      : Array[0..99] of JOB_INFO_1; 

begin 

         cbBuf := 1000; 

 

         bResult := OpenPrinter(PChar(sPrinterName), hPrinter, Nil); 

         if NOT bResult then begin 

            ShowMessage('Error opening the printer'); 

            exit; 

         end; 

 

         bResult := EnumJobs(hPrinter,0,Length(aJobs),1,@aJobs,cbBuf,pcbNeeded,pcReturned); 

         if NOT bResult then begin 

            ShowMessage('Error Getting Jobs information'); 

            exit; 

         end; 

 

         for i:=0 to pcReturned-1 do begin 

             if aJobs[i].pDocument <> Nil then begin 

                SetLength(Result, Length(Result)+1); 

                Result[Length(Result)-1] := aJobs[i]; 

             end; 

         end; 

end; 

 

An example of use: 

1- Create a new project with a StringGrid and a Timer. 

2- Set “ColCount” and “RowCount” properties of the string grid to 20. 

3- Set the “Interval” property of the Timer to 500. 

4- On the “OnTime” event of the timer write the following code : 

 

procedure TForm1.Timer1Timer(Sender: TObject); 

var 

          i, ii : Integer; 

          aJobs : JOB_INFO_1_ARRAY; 

begin 

          for i:=0 to StringGrid1.ColCount-1 do 

              for ii:=0 to StringGrid1.RowCount-1 do StringGrid1.Cells[i,ii] := ''; 

 

          aJobs := GetSpoolerJobs('HP LaserJet 6L PCL'); 

 

          for i:=0 to Length(aJobs)-1 do begin 

              StringGrid1.Cells[i,0] := aJobs[i].pPrinterName; 

              StringGrid1.Cells[i,1] := aJobs[i].pMachineName; 

              StringGrid1.Cells[i,2] := aJobs[i].pUserName; 

              StringGrid1.Cells[i,3] := aJobs[i].pDocument; 

              StringGrid1.Cells[i,4] := aJobs[i].pDatatype; 

              StringGrid1.Cells[i,5] := aJobs[i].pStatus; 

              StringGrid1.Cells[i,6] := IntToStr(aJobs[i].Status); 

 

              case aJobs[i].Status of 

                   JOB_STATUS_PAUSED: StringGrid1.Cells[i,6] := 'JOB_STATUS_PAUSED'; 

                   JOB_STATUS_ERROR: StringGrid1.Cells[i,6] := 'JOB_STATUS_ERROR'; 

                   JOB_STATUS_DELETING: StringGrid1.Cells[i,6] := 'JOB_STATUS_DELETING'; 

                   JOB_STATUS_SPOOLING: StringGrid1.Cells[i,6] := 'JOB_STATUS_SPOOLING'; 

                   JOB_STATUS_PRINTING: StringGrid1.Cells[i,6] := 'JOB_STATUS_PRINTING'; 

                   JOB_STATUS_OFFLINE: StringGrid1.Cells[i,6] := 'JOB_STATUS_OFFLINE'; 

                   JOB_STATUS_PAPEROUT: StringGrid1.Cells[i,6] := 'JOB_STATUS_PAPEROUT'; 

                   JOB_STATUS_PRINTED: StringGrid1.Cells[i,6] := 'JOB_STATUS_PRINTED'; 

                   JOB_STATUS_DELETED: StringGrid1.Cells[i,6] := 'JOB_STATUS_DELETED'; 

                   JOB_STATUS_BLOCKED_DEVQ: StringGrid1.Cells[i,6] := 'JOB_STATUS_BLOCKED_DEVQ'; 

                   JOB_STATUS_USER_INTERVENTION: StringGrid1.Cells[i,6] := 'JOB_STATUS_USER_INTERVENTION'; 

                   JOB_STATUS_RESTART: StringGrid1.Cells[i,6] := 'JOB_STATUS_RESTART'; 

                   JOB_POSITION_UNSPECIFIED: StringGrid1.Cells[i,6] := 'JOB_POSITION_UNSPECIFIED'; 

 

              else StringGrid1.Cells[i,6] := 'Unknown status...'; 

              end; 

          end; 

 

          StringGrid1.Refresh; 

end;