Printer analysis

Posted on 1999-01-05
Last Modified: 2010-05-18
I am trying to write a program that can detect when the attached printer (either local or on the network) starts printing a job and when it stops printing that job.  The program will then time how long it takes to complete printing the job in question.  The jobs can be from any application (eg a MS Word doc that is being printed).

How can I detect and monitor the status of a print job that has been spooled by an external program (eg MS Word) ?

I would be grateful for any help offered regarding this.

Thanks in advance

John Clarke
Question by:johnclarke
LVL 20

Expert Comment

ID: 1354607
Hi John,

please look at winAPI EnumJobs. Sorry, have no demo sources for that, but it should be exactly what you need...

Regards, Madshi.

Accepted Solution

puzhikadu earned 100 total points
ID: 1354608
const INCHES_PER_MILIMETER : Real  = 0.04;type  TOffset =   record
               X,Y: Integer;              end;
var FDeviceName : String;  {Get the name}
    FPageHeightPixel, FPageWidthPixel : Integer ;  {Page height and Page Width}
    FOrientation : TPrinterOrientation; {Orientation}
    FPrintOffsetPixels : TOffset;    FPixelsPerMMX,FPixelsPerMMY: Real;
    MMSize, FPageHeightMM : Integer;
    TheReport, TheHead, HeadLine, RecordLine, TFname, TLname :String;
procedure TMissing_Rep.GetDeviceSettings;var  retval: integer;
  PixX, PixY: Integer;begin
    FDeviceName := Printer.Printers[Printer.PrinterIndex];  {Get the name}
    FPageHeightPixel := Printer.PageHeight;                 {Page height}
    FPageWidthPixel := Printer.PageWidth;                   {Page Width}
    FOrientation := Printer.Orientation;{Orientation}
    {Get the printable area offsets}    {$IFDEF WIN32}
       FPrintOffsetPixels.X := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETX);
       FPrintOffsetPixels.Y := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETY);
    {$ELSE}       retval := Escape(Printer.Handle,GETPRINTINGOFFSET,
                        0, nil, @FPrintOffsetPixels);    {$ENDIF}
    {Get Pixels per Milimeter Ratio}
    PixX := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
    PixY :=  GetDeviceCaps(Printer.Handle, LOGPIXELSY);
    FPageHeightMM := Round(FPageHeightPixel/FPixelsPerMMY); end;
function TMissing_Rep.PutText(mmX,mmY: Integer; S: string; LeftAlign:
Boolean): boolean;var  X, Y: Integer;  align: WORD;begin  if LeftAlign then
    align :=  SetTextAlign(Printer.Handle,TA_BOTTOM or TA_LEFT)  else
    align :=  SetTextAlign(Printer.Handle,TA_BOTTOM or TA_RIGHT);
  result := FALSE; {Assume fail}
  X := Trunc(mmX * FPixelsPerMMX) - FPrintOffsetPixels.X;
  Y := Trunc(mmY * FPixelsPerMMY) - FPrintOffsetPixels.Y;  if X < 0 then exit;
  if Y < 0 then exit;  Printer.Canvas.TextOut(X,Y,S);  result := TRUE;end;
procedure TMissing_Rep.Print_ButClick(Sender: TObject);var PixelSize: Integer;
beginPrint_But.Enabled := False;if PrintDialog1.Execute then begin
 Printer.Canvas.Font := Missing_Rep.Font;
 PixelSize := Printer.Canvas.TextHeight('Yy');
 MMSize := Round(PixelSize/FPixelsPerMMY);
 Printer.Title := 'Breast Cancer Project Missing Report';
 Printer.BeginDoc;                        { begin to send print job to printer }
 Printer.EndDoc;                 { EndDoc ends and starts printing print job }
 end; Print_But.Enabled := True; end;procedure TMissing_Rep.PrintGenerator;Var
  yLoc , NumRows, TheRow :Integer;  procedure Heading;  begin   yLoc := 20;
   PutText(20, 20, TheHead, TRUE);   yLoc := yLoc + MMSize;
   PutText(20,  yLoc, StringGrid1.Cells[0,0], TRUE);
   PutText(60,  yLoc, StringGrid1.Cells[1,0], TRUE);
   PutText(100, yLoc, StringGrid1.Cells[2,0], TRUE);
   PutText(120, yLoc, StringGrid1.Cells[3,0], TRUE);
   PutText(150, yLoc, StringGrid1.Cells[4,0], TRUE);   yLoc := yLoc + MMSize;
 end;  procedure Footer;  begin
  PutText(100,FPageHeightMM,InttoStr(Printer.PageNumber), TRUE);  end;begin
   Heading;   TheRow := 1;   while (TheRow < StringGrid1.RowCount) do   begin
       if (yLoc > (FPageHeightMM - MMSize)) then         begin              Footer;
              Printer.NewPage;              Heading;           end;
       TheGauge.Progress := Round(100 * TheRow/(StringGrid1.RowCount - 1));
       PutText(20,  yLoc, StringGrid1.Cells[0,TheRow], TRUE);
       PutText(60,  yLoc, StringGrid1.Cells[1,TheRow], TRUE);
       PutText(100, yLoc, StringGrid1.Cells[2,TheRow], TRUE);
       PutText(120, yLoc, StringGrid1.Cells[3,TheRow], TRUE);
       PutText(150, yLoc, StringGrid1.Cells[4,TheRow], TRUE);       yLoc := yLoc + MMSize;
       TheRow := TheRow + 1; end;Footer;end;

Featured Post

Announcing the Most Valuable Experts of 2016

MVEs are more concerned with the satisfaction of those they help than with the considerable points they can earn. They are the types of people you feel privileged to call colleagues. Join us in honoring this amazing group of Experts.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Objective: - This article will help user in how to convert their numeric value become words. How to use 1. You can copy this code in your Unit as function 2. than you can perform your function by type this code The Code   (CODE) The Im…
Introduction Raise your hands if you were as upset with FireMonkey as I was when I discovered that there was no TListview.  I use TListView in almost all of my applications I've written, and I was not going to compromise by resorting to TStringGrid…
Microsoft Active Directory, the widely used IT infrastructure, is known for its high risk of credential theft. The best way to test your Active Directory’s vulnerabilities to pass-the-ticket, pass-the-hash, privilege escalation, and malware attacks …
Finds all prime numbers in a range requested and places them in a public primes() array. I've demostrated a template size of 30 (2 * 3 * 5) but larger templates can be built such 210  (2 * 3 * 5 * 7) or 2310  (2 * 3 * 5 * 7 * 11). The larger templa…

790 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question