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 Position einer Progressbar aus fremder Anwendung auslesen (https://www.delphipraxis.net/55588-position-einer-progressbar-aus-fremder-anwendung-auslesen.html)

POSHxxx 23. Okt 2005 18:13


Position einer Progressbar aus fremder Anwendung auslesen
 
Hallo zusammen!

Ich möchte durch mein Programm die Position einer Progressbar einer anderen Anwendung ausgeben lassen.

Beispiel: Ich kopiere Daten mit der normalen Windows-"Kopieren"-Funktion; zu sehen ist der Kopieren-Dialog mit Progressbar und Zusatzinformationen.

Wie wir wissen, ist die aktuelle Position der Progressbar in der Eigenschaft Position gespeichert. Darauf möchte ich nun zugreifen.

Was ich weiß: Der Klassenname einer solchen Progressbar lautet "msctls_progress32". Ich kann das Handle mittels FindWindowEx etc. finden.

ABER: Welche Funktion aber benutze ich zum Auslesen der Position?

SirThornberry 23. Okt 2005 18:17

Re: Position einer Progressbar aus fremder Anwendung auslese
 
das ganze geht mit
Delphi-Quellcode:
SendMessage(Handle, PBM_GETPOS, 0, 0)
bzw.
Delphi-Quellcode:
SendMessage(Handle, PBM_DELTAPOS, 0, 0)
die constanten sind in der unit commctrl definiert.

POSHxxx 23. Okt 2005 18:57

Re: Position einer Progressbar aus fremder Anwendung auslese
 
Okay. Soweit so gut. Leider erhalte ich als Ausgabe eine sehr verwirrende Zeichenkombination.

Was mache ich falsch?

Code:
function TextUebergeben: string;
var
  hMemo, hHandleDesFensters : HWND;
  Text : pchar;
  len: Integer;
begin
  SetLastError(0);
  hHandleDesFensters := FindWindow(nil, 'Kopieren...');
  if hHandleDesfensters <> 0 then
  begin
    hMemo:= FindWindowEx(hHandleDesFensters, 0, 'msctls_progress32', nil);
    if hMemo <> 0 then
    begin
      len := SendMessage(hMemo, PBM_GETPOS, 0, 0);
      GetMem(Text, len+1);
      try
        try
          SendMessage(hMemo, PBM_GETPOS, len+1, Integer(@Text[0]));
          result := String(Text);
        except
          on E: EOutOfMemory do Messagebox(form1.Handle, PChar(E.Message), 'Fehler', MB_ICONSTOP);
        end;
      finally
        FreeMem(Text, len+1);
      end;
    end
    else
      Messagebox(form1.Handle, PChar(SysErrorMessage(GetLastError)), 'Fehler', MB_ICONSTOP);
  end
  else
    Messagebox(form1.Handle, PChar(SysErrorMessage(GetLastError)), 'Fehler', MB_ICONSTOP);
end;

SirThornberry 23. Okt 2005 19:07

Re: Position einer Progressbar aus fremder Anwendung auslese
 
ich verstehe nicht ganz was du da mit getmem machst. Eigentlich gibt doch SendMessage schon die Position zurück!

Palando 23. Okt 2005 20:35

Re: Position einer Progressbar aus fremder Anwendung auslese
 
Laut msdn muss der l- sowie der wParam der Message immer 0 sein und zurück bekommt man, wie mein vorschreiber schon sagte, ja die Position der Progressbar gleich von der Message.

Also ist in der Variable len die Position der Progressbar gespeichert. Wozu ist das andere da?

Van HelF 24. Okt 2005 12:45

Re: Position einer Progressbar aus fremder Anwendung auslese
 
Klingt jetzt vielleicht etwas dumm, aber welche units/api´s brauche ich für PBM_GETPOS auszulesen ?!

Ultimator 24. Okt 2005 12:49

Re: Position einer Progressbar aus fremder Anwendung auslese
 
@VanHelf:
Delphi-Quellcode:
uses ...CommCtrl...
:)

Rastaman 24. Okt 2005 12:53

Re: Position einer Progressbar aus fremder Anwendung auslese
 
Is aber irgendwie Quatsch commctrl nur für die eine Nachricht einzubinden :?
Einfach einmal commctrl einbinden, onCreate

Delphi-Quellcode:
ShowMessage(IntToStr(PBM_GETPOS));
den Wert merken, commctrl entfernen und PBM_GETPOS selber definieren :zwinker:

Van HelF 24. Okt 2005 13:00

Re: Position einer Progressbar aus fremder Anwendung auslese
 
Vielen dank habe es auch geschafft die position herauszubekommen, nur welchen maximalwert hat die progressbar, da bei mir werte > 100 herauskommen

Rastaman 24. Okt 2005 13:28

Re: Position einer Progressbar aus fremder Anwendung auslese
 
Mit PBM_GETRANGE wobei wParam False sein muss, also so:

Delphi-Quellcode:
  max := SendMessage(pbhwnd, PBM_GETRANGE, False, 0);

Van HelF 24. Okt 2005 13:35

Re: Position einer Progressbar aus fremder Anwendung auslese
 
Ok, funktioniert auch (aber etwas anders : SendMessage(hMemo, PBM_GETRANGE, 0, 0))
ist es möglich die restzeit auszulesen
und das kopieren fenster unsichtbar zu machen, sodass man nur noch den eigenen fortschrittsbalken hat ?

Luckie 24. Okt 2005 15:10

Re: Position einer Progressbar aus fremder Anwendung auslese
 
Was hast du eigentlich vor?

Rastaman 24. Okt 2005 15:11

Re: Position einer Progressbar aus fremder Anwendung auslese
 
Den Kopieren-Dialog von Windows finden, Progressbarstatus und Restzeit auslesen, ihn unsichtbar machen und halt alles in einem eigenen Programm anzeigen, soweit ich das verstanden habe :cyclops:

Van HelF 24. Okt 2005 15:29

Re: Position einer Progressbar aus fremder Anwendung auslese
 
@Rastaman : Ganz genau :thumb:

NicoDE 24. Okt 2005 16:22

Re: Position einer Progressbar aus fremder Anwendung auslese
 
Zitat:

Zitat von Rastaman
Den Kopieren-Dialog von Windows finden, Progressbarstatus und Restzeit auslesen, ihn unsichtbar machen und halt alles in einem eigenen Programm anzeigen, soweit ich das verstanden habe :cyclops:

Viel Spaß mit neuen Windows-Versionen...
(schon in der nächsten werden die Dialoge anders aussehen)

POSHxxx 24. Okt 2005 18:36

Re: Position einer Progressbar aus fremder Anwendung auslese
 
Nur zum besseren Verständnis:

Ich will auf die Position einer Progressbar zugereifen, um bei umfangreichen Aktionen in regelmäßigen Abständen per Sprachausgabe den Fortschritt ausgeben zu lassen.

Danke für eure Hilfe!

Van HelF 24. Okt 2005 19:04

Re: Position einer Progressbar aus fremder Anwendung auslese
 
Ich hoffe das hilft dir weiter, hab deinen soruke mal schnell etwas umgeschrieben.

Delphi-Quellcode:
procedure TextUebergeben(var max, len: integer);
var
  hMemo, hHandleDesFensters : HWND;
  Text : pchar;

begin
  SetLastError(0);
  hHandleDesFensters := FindWindow(nil, 'Kopieren...');
  if hHandleDesfensters <> 0 then
  begin
    hMemo:= FindWindowEx(hHandleDesFensters, 0, 'msctls_progress32', nil);
    if hMemo <> 0 then
    begin
      len := SendMessage(hMemo, PBM_GETPOS, 0, 0);
      GetMem(Text, len+1);
      try
        try
          SendMessage(hMemo, PBM_GETPOS, len+1, Integer(@Text[0]));//Position
          max := SendMessage(hMemo, PBM_GETRANGE, 0, 0); //Maximalwert
        except
          on E: EOutOfMemory do Messagebox(form1.Handle, PChar(E.Message), 'Fehler', MB_ICONSTOP);
        end;
      finally
        FreeMem(Text, len+1);
      end;
    end
    else
      Messagebox(form1.Handle, PChar(SysErrorMessage(GetLastError)), 'Fehler', MB_ICONSTOP);
  end
  else
    Messagebox(form1.Handle, PChar(SysErrorMessage(GetLastError)), 'Fehler', MB_ICONSTOP);
end;

procedure TForm1.Button1Click(Sender: TObject);
var pos, max:integer;
begin
  try
    textuebergeben(max, pos);
    showmessage(inttostr(pos)+'/'+inttostr(max));
  except
  end;
end;

Van HelF 24. Okt 2005 20:14

Re: Position einer Progressbar aus fremder Anwendung auslese
 
Aber wieder zur frage :
Den Kopieren-Dialog von Windows finden, Progressbarstatus (soweit erledigt) und Restzeit auslesen, ihn unsichtbar machen und halt alles in einem eigenen Programm anzeigen

hat jemand eine ahnung wie man das realisieren könnte ?

SirThornberry 24. Okt 2005 20:18

Re: Position einer Progressbar aus fremder Anwendung auslese
 
@Helf: Du hast doch selbst mit dem Source den Ansatz gepostet. Du hast das Handle vom Dialog, du hast das Handle von der Progressbar, du weißt wie man die Position und das Max abfragt, jetzt brauchst du nur noch mit ShowWindow den Dialog ausblenden.

Van HelF 24. Okt 2005 20:34

Re: Position einer Progressbar aus fremder Anwendung auslese
 
Vielen dank für den tipp, hat nach ein bisschen suche im forum funktioniert
Delphi-Quellcode:
ShowWindow(hHandleDesFensters,SW_HIDE);
Nur jetzt hätte ich noch 2 fragen, wie lese ich die restzeit aus, und wie kann ich in dem jetzt unsichtbaren kopieren fenster den abbrechen button drücken, wenn das überhaupt dann noch möglich ist?!

SirThornberry 24. Okt 2005 20:45

Re: Position einer Progressbar aus fremder Anwendung auslese
 
die Restzeit kannst du doch selbst berechnen. Wenn du immer mal wieder die position abfragst (was du ja machen musst damit dein Fortschritt mit wandert) dann kannst du ja prüfen wie weit der Vortschritt innerhalb einer bestimmten zeit gewandert ist und dementsprechend ausrechnen wie lange es noch dauert.

Van HelF 24. Okt 2005 20:48

Re: Position einer Progressbar aus fremder Anwendung auslese
 
hmm, das ist mir etwas zuviel knaup, kann man nicht das handle oder so von dem restzeit"label" auslesen und sich anzeigen lassen ?!

Van HelF 26. Okt 2005 16:32

Re: Position einer Progressbar aus fremder Anwendung auslese
 
Ich wollte den fokus mal auf die hier noch ungeklärten fragen lenken ...

Amnon82 23. Apr 2006 21:44

Selbe Problem
 
Selbes Problem hab ich auch ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:25 Uhr.

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