Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Druckerdokumentenlisteneintrag markieren (https://www.delphipraxis.net/84296-druckerdokumentenlisteneintrag-markieren.html)

kandesbunzler 14. Jan 2007 23:42


Druckerdokumentenlisteneintrag markieren
 
Hallo allerseits,

auch auf die Gefahr, daß mein Problem u./o. ich erkannt werden - hier ist es:

Ich möchte aus einer SysLiestView32 den ersten Listeneintrag markieren. Als Applikation handelt es sich um ein Dienstprogramm, aber verfahrenstechnisch könnte es sich auch bspw. um die Dokumentenliste eines Druckers handeln.

Problem: Mit folgendem Samplecode wird in der dritten Zeile nach 'begin' der Wert '0' zurückgeliefert:

Delphi-Quellcode:
var
  wnd: HWND;
begin
  wnd := FindWindow('#32770', 'SX Virtual Link');
  wnd := FindWindowEx(wnd, 0, '#32770', nil);
  wnd := FindWindowEx(wnd, 0, 'SysListView32', nil);

  if wnd <> 0 then
  begin

  end;
end;
Auf bald ...
kandesbunzler.

kandesbunzler 6. Feb 2007 23:07

Re: Druckerdokumentenlisteneintrag markieren
 
Hallo allerseits

und ooch nööh: Hat denn gar keiner eine Idee?

Anders gefragt: Mit bspw. EDA erhalte ich für die Subkategorien weitere Werte sowohl für Windows - Handles als auch für Control-ID´s.

Da beim u.g. Code bereits nach Zeile 3 Null erhalte , müssen doch in den Tools vom EDA, X_Spy etc. tiefergehende Abfragen existieren.

Frage: Welche könnten das sein?

Auf bald ...
kandesbunzler.

popo2006 7. Feb 2007 01:06

Re: Druckerdokumentenlisteneintrag markieren
 
Zwar verstehe ich die Frage nicht so ganz, aber trotzdem:

Delphi-Quellcode:
var
  wnd: HWND;
begin
  wnd := FindWindow('#32770', 'SX Virtual Link');
  if wnd <> 0 then
  wnd := FindWindowEx(wnd, 0, '#32770', nil);
  if wnd <> 0 then
  wnd := FindWindowEx(wnd, 0, 'SysListView32', nil);

  if wnd <> 0 then
  begin

  end;
end;
mfg

kandesbunzler 8. Feb 2007 22:08

Re: Druckerdokumentenlisteneintrag markieren
 
Hallo

und danke für die Rückmeldung.

Allzuschwierig sollte es eigentlich nicht sein. Bspw.:

1. Drucker pausieren
2. Druckjob aus bspw. Word abschicken
3. Welche ID, Handle o.w.w.i. hat der Druckjobeintrag.

Die "wnd <> 0" sind nicht das Problem. Wie erhalte ich programatisch das Handle für o.g. Druckjobeintrag oder wenigstens für die ListView32? Der genannte Code scheitert am Rückgabewert 0 in Zeile 3. Mit XSpy geht es noch mind. zwei Unterstufen weiter, welche ich versuche, zu ermitteln.

Auf bald ...
kandesbunzler.

PS: Ist der Quellcode für XSpy o.ä. verfügbar?

bitsetter 9. Feb 2007 01:31

Re: Druckerdokumentenlisteneintrag markieren
 
Hallo,
hier habe ich ein kleines Beispiel, um bestimmte Druckaufträge zu pausieren. Ich hoffe mal, dass ist das was du wolltest.
Delphi-Quellcode:
uses
  WinSpool, Printers;

procedure TForm1.Button1Click(Sender: TObject);
const
  MaxJobs = 1024;
type TJobs= array of TJobInfo2;
var
  NoJobs: Integer;
  Needed, JobCounter: DWORD;
  i : Integer;
  Device, Driver, Port : array[0..255] of char;
  hPrinter, hDeviceMode : THandle;
  Buffer : Pointer;
begin
  Printer.PrinterIndex := -1;
  Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
  if not WinSpool.OpenPrinter(@Device, hPrinter, nil) then
    Exit;

  GetPrinter(hPrinter, 2, nil, 0, @Needed);
  GetMem(Buffer, Needed);
  if GetPrinter(hPrinter, 2, Buffer, Needed, @Needed) then
    if TPrinterInfo2A(Buffer^).pPrinterName <> nil then
      Caption:= 'Druckername: '+TPrinterInfo2A(Buffer^).pPrinterName;

  NoJobs:= 100;
  EnumJobs(hPrinter, 0, NoJobs, 2, nil, 0, Needed, JobCounter);
  GetMem(Buffer, Needed);

  if EnumJobs(hPrinter, 0, NoJobs, 2, Buffer, Needed, Needed, JobCounter) then
    begin
    Caption:= Caption+ ' Anzahl der Druckaufträge: '+ inttostr(JobCounter);
      for i:= 0 to JobCounter- 1 do
        begin
        if TJobInfo2(ptr(cardinal(Buffer)+ i* SizeOf(TJobInfo2))^).pDocument<> nil then
          if messagebox(0, PChar('Soll der Druckauftrag der Datei "'+ TJobInfo2(ptr(cardinal(Buffer)+i* SizeOf(TJobInfo2))^).pDocument+ '" pausieren?')
            ,'Nachfrage', MB_YESNO or MB_ICONQUESTION)=idYES then
            SetJob(hPrinter, TJobInfo2(ptr(cardinal(Buffer)+ i* SizeOf(TJobInfo2))^).JobId, 0, nil, JOB_CONTROL_PAUSE);//winspool.JOB_CONTROL_RESUME
        end;
    end;
  FreeMem(Buffer, Needed);
  WinSpool.ClosePrinter(hPrinter);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:03 Uhr.

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