![]() |
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? |
Re: Position einer Progressbar aus fremder Anwendung auslese
das ganze geht mit
Delphi-Quellcode:
bzw.
SendMessage(Handle, PBM_GETPOS, 0, 0)
Delphi-Quellcode:
die constanten sind in der unit commctrl definiert.
SendMessage(Handle, PBM_DELTAPOS, 0, 0)
|
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; |
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!
|
Re: Position einer Progressbar aus fremder Anwendung auslese
![]() Also ist in der Variable len die Position der Progressbar gespeichert. Wozu ist das andere da? |
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 ?!
|
Re: Position einer Progressbar aus fremder Anwendung auslese
@VanHelf:
Delphi-Quellcode:
:)
uses ...CommCtrl...
|
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:
den Wert merken, commctrl entfernen und PBM_GETPOS selber definieren :zwinker:
ShowMessage(IntToStr(PBM_GETPOS));
|
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
|
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);
|
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 ? |
Re: Position einer Progressbar aus fremder Anwendung auslese
Was hast du eigentlich vor?
|
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:
|
Re: Position einer Progressbar aus fremder Anwendung auslese
@Rastaman : Ganz genau :thumb:
|
Re: Position einer Progressbar aus fremder Anwendung auslese
Zitat:
(schon in der nächsten werden die Dialoge anders aussehen) |
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! |
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; |
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 ? |
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.
|
Re: Position einer Progressbar aus fremder Anwendung auslese
Vielen dank für den tipp, hat nach ein bisschen suche im forum funktioniert
Delphi-Quellcode:
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?!
ShowWindow(hHandleDesFensters,SW_HIDE);
|
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.
|
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 ?!
|
Re: Position einer Progressbar aus fremder Anwendung auslese
Ich wollte den fokus mal auf die hier noch ungeklärten fragen lenken ...
|
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