Delphi-PRAXiS
Seite 1 von 3  1 23      

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);


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:22 Uhr.
Seite 1 von 3  1 23      

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