Autor Beitrag
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 27.03.19 02:34 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Holgerx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 62
Erhaltene Danke: 27

Win95 - Win11 / MSServer2000 - MSServer2019
Delphi 6pro / XE4
BeitragVerfasst: Mi 27.03.19 06:37 
Hmm..

Hab da mal etwas in meinen alten Tests rumgesucht...

Dort wurde in einer Schleife per
FindFirstPrinterChangeNotification
FindNextPrinterChangeNotification
auf Änderungen gepollt..

und dann mit EnumJobs die Druckjobs ausgelesen..

Aus dem Test herausgeschnitten:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
uses
  Winspool, Printers;

function GetCurrentPrinterHandle: THandle;
var
  Device, Driver, Port: array[0..255of Char;
  hDeviceMode: THandle;
begin
  Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
  if not OpenPrinter(@Device, Result, nilthen RaiseLastWin32Error;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  FFinder : cardinal;
  FNotifyInfo : PRINTER_NOTIFY_OPTIONS;
  FPrinter : THandle;
  FFlags : DWord;
  p : Pointer;
begin
  FPrinter := GetCurrentPrinterHandle;
  try
    FCancel := false;
    FFinder := FindFirstPrinterChangeNotification(FPrinter, PRINTER_CHANGE_JOB, 0nil);
    if FFinder = INVALID_HANDLE_VALUE then
      raise Exception.Create('Cannot create notification object\');
    try
      while not FCancel do begin
        if WaitForSingleObject(FFinder, 50) = WAIT_OBJECT_0 then begin
          if FindNextPrinterChangeNotification(FFinder, FFlags, NIL, p) then begin

{Where pdwChange can be:
PRINTER_CHANGE_ADD_FORM                         A form was added to the server.
PRINTER_CHANGE_ADD_JOB                          A print job was sent to the printer.
PRINTER_CHANGE_ADD_PORT                         A port or monitor was added to the server.
PRINTER_CHANGE_ADD_PRINT_PROCESSOR              A print processor was added to the server.
PRINTER_CHANGE_ADD_PRINTER                      A printer was added to the server.
PRINTER_CHANGE_ADD_PRINTER_DRIVER               A printer driver was added to the server.
PRINTER_CHANGE_CONFIGURE_PORT                   A port was configured on the server.
PRINTER_CHANGE_DELETE_FORM                      A form was deleted from the server.
PRINTER_CHANGE_DELETE_JOB                       A job was deleted.
PRINTER_CHANGE_DELETE_PORT                      A port or monitor was deleted from the server.
PRINTER_CHANGE_DELETE_PRINT_PROCESSOR           A print processor was deleted from the server.
PRINTER_CHANGE_DELETE_PRINTER                   A printer was deleted.
PRINTER_CHANGE_DELETE_PRINTER_DRIVER            A printer driver was deleted from the server.
PRINTER_CHANGE_FAILED_CONNECTION_PRINTER        A printer connection has failed.
PRINTER_CHANGE_SET_FORM                         A form was set on the server.
PRINTER_CHANGE_SET_JOB                          A job was set.
PRINTER_CHANGE_SET_PRINTER                      A printer was set.
PRINTER_CHANGE_SET_PRINTER_DRIVER               A printer driver was set.
PRINTER_CHANGE_WRITE_JOB                        Job data was written.}


            if (FFlags and PRINTER_CHANGE_ADD_JOB)<>0 then begin
              ShowMessage('A print job was sent to the printer.');
//              ButtonGetJobs.Click;
            end;

            FreePrinterNotifyInfo(p);
          end;
        end;
        Application.ProcessMessages;
      end;
    finally
      FindClosePrinterChangeNotification(FFinder);
    end;
  finally
    ClosePrinter(FPrinter);
  end;

end;


procedure TForm1.ButtonGetJobsClick(Sender: TObject);
type
  TJobs  = array [0..1000of JOB_INFO_1;
  PJobs = ^TJobs;
var
  hPrinter: THandle;
  bytesNeeded, numJobs, i: Cardinal;
  pJ: PJobs;
begin
  memo1.Lines.Add('');
  hPrinter := GetCurrentPrinterHandle;
  try
    EnumJobs(hPrinter, 010001nil0, bytesNeeded,numJobs);
    pJ := AllocMem(bytesNeeded);
    if not EnumJobs(hPrinter, 010001, pJ, bytesNeeded, bytesNeeded, numJobs) then
      RaiseLastWin32Error;

//    memo1.Clear;
    if numJobs = 0 then
      memo1.Lines.Add('No jobs in queue')
    else
      for i := 0 to Pred(numJobs) do begin
        memo1.Lines.Add(Format('Printer %s, Job %s, Status (%d): %s',
          [SavePChar(pJ^[i].pPrinterName), SavePChar(pJ^[i].pDocument),
          pJ^[i].Status, SavePChar(pJ^[i].pStatus)]));
        if Listbox1.Items.IndexOfName(IntToStr(pJ^[i].JobId)) = -1 then begin
          Listbox1.Items.Add(IntToStr(pJ^[i].JobId)+'='+ IntToStr(pJ^[i].TotalPages)+ '_'+SavePChar(pJ^[i].pUserName));
        end;
      end;
  finally
    ClosePrinter(hPrinter);
  end;
end;
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 28.03.19 03:31 
- Nachträglich durch die Entwickler-Ecke gelöscht -