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..99of 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: 

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

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

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

4On 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