Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Druckaufträge überwachen und Programm starten (https://www.delphipraxis.net/162347-druckauftraege-ueberwachen-und-programm-starten.html)

chaosben 25. Aug 2011 13:07

AW: Druckaufträge überwachen und Programm starten
 
Hier hätten wir noch ein Stück simplen kurzen Code:
Delphi-Quellcode:
TMyThread = class(TThread)
  protected
    FPrinter : THandle;
    procedure Execute; override;
  public
    constructor Create(APrinter : THandle); reintroduce;
  end;

//...

constructor TMyThread.Create(APrinter : THandle);
begin
  FPrinter := APrinter;
  inherited Create(false);
end;

procedure TMyThread.Execute;
var
  change : THandle;
  changed : Cardinal;
  info : Pointer;
  s : String;
begin
  change := FindFirstPrinterChangeNotification(FPrinter, PRINTER_CHANGE_JOB, 0, nil);
  while not Terminated do
  begin
    if WaitForSingleObject(change, 500) <> WAIT_TIMEOUT then
    begin
      if FindNextPrinterChangeNotification(change, changed, nil, info) then
      begin
        case changed of
          PRINTER_CHANGE_ADD_JOB: s := 'add job';
          PRINTER_CHANGE_SET_JOB: s := 'set job';
          PRINTER_CHANGE_DELETE_JOB: s := 'delete job';
          PRINTER_CHANGE_WRITE_JOB: s := 'write job';
        end;
        Synchronize(procedure begin ShowMessage(s) end);
        FreePrinterNotifyInfo(info);
      end;
    end;
  end;

  FindClosePrinterChangeNotification(change);
end;
Getestet unter Win7_64 mit D2009 .. funzt

Oliver1983 25. Aug 2011 13:18

AW: Druckaufträge überwachen und Programm starten
 
Zitat:

Zitat von chaosben (Beitrag 1119587)
Hier hätten wir noch ein Stück simplen kurzen Code:
Delphi-Quellcode:
TMyThread = class(TThread)
  protected
    FPrinter : THandle;
    procedure Execute; override;
  public
    constructor Create(APrinter : THandle); reintroduce;
  end;

//...
Getestet unter Win7_64 mit D2009 .. funzt

D.h. einfacher geschrieben als ASM? oder muss ich das zu dem Projekt von ASM zufügen?

Gruß Olli

Danke für eure Hilfe

Uwe Raabe 25. Aug 2011 13:19

AW: Druckaufträge überwachen und Programm starten
 
Zitat:

Zitat von Oliver1983 (Beitrag 1119594)
Zitat:

Zitat von chaosben (Beitrag 1119587)
Hier hätten wir noch ein Stück simplen kurzen Code:
Delphi-Quellcode:
TMyThread = class(TThread)
  protected
    FPrinter : THandle;
    procedure Execute; override;
  public
    constructor Create(APrinter : THandle); reintroduce;
  end;

//...
Getestet unter Win7_64 mit D2009 .. funzt

D.h. einfacher geschrieben als ASM? oder muss ich das zu dem Projekt von ASM zufügen?

Nein, der Code tut auch so, was er soll.

Oliver1983 25. Aug 2011 14:12

AW: Druckaufträge überwachen und Programm starten
 
So das ist ja jetzt Super das das alles geklärt ist! So nun möchte ich aber das ein Index zurück gegeben wird wenn der einen Print job findet und danach wenn dieser fertig ist! Welcher Drucker das ist!

Die installierten Drucker lese ich so aus:

Delphi-Quellcode:
procedure TForm1.Btn_lese_alle_DruckerClick(Sender: TObject);
var
 i : integer;
begin
 Combobox1.Clear;

 for i := 0 to Printers.Printer.Printers.Count-1 do
  begin
   combobox1.Items.Add(Printers.Printer.Printers.Strings[i]);
  end;

end;
Somit habe ich den Index der Drucker gleich mit, übernehme den Index von der Combobox, da dieser gleich ist wie der von den Windows Druckern!!!

Das ist meine alte funktion:

Delphi-Quellcode:
function print_jobs(printer_index: integer) : integer;
type
  PJobs = ^TJobs;
  TJobs = array[0..0]of TJobInfo2;
var
  Needed, JobCounter : DWORD;
  i : Integer;
  Device, Driver, Port : array[0..255] of char;
  hPrinter, hDeviceMode : THandle;
  Buffer : Pointer;
  Job : PJobs;
const
  NoJobs = 100;
begin
//TEIL1

  Printer.PrinterIndex := printer_index;
  Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
  if WinSpool.OpenPrinter(@Device, hPrinter, nil) then
  begin
    EnumJobs(hPrinter, 0, NoJobs, 2, nil, 0, Needed, JobCounter);
    GetMem(Buffer, Needed);
   // Buffer := AllocMem(Needed);

    try
      Job := Buffer;

      if EnumJobs(hPrinter, 0, NoJobs, 2, Buffer, Needed, Needed, JobCounter) then
        begin
        Form1.LabeledEdit2.Text := IntToStr(JobCounter);
        if JobCounter > 0 then
         begin
           result := 1;
         end;
          for i := 0 to JobCounter - 1 do
            begin
            if Job[i].pDocument <> nil then
              Form1.LabeledEdit3.Text := IntToStr(Job[i].TotalPages);
            end;
        end;

    finally
      FreeMem(Buffer, Needed);
    end;

   WinSpool.ClosePrinter(hPrinter);
  end;

 sleep(10);
end;
Gruß Olli


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:54 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz