![]() |
Werte aus der Statusleiste eines fremden Programms erhalten
Ich habe folgendes Problem: Wir benutzen in unserer Firma ein Programm, dessen Statusleiste ich auslesen soll. Da niemand von euch das Programm kennen wird, verwende ich in meinem Quelltext, den ich hier poste, den Internet Explorer. Ich habe das eben nur geschrieben um zu sagen, dass mir irgendwelche Automationsschittstellen für den Internet Explorer nicht weiterhelfen, da ich auf ein anderes Programm zugreifen möchte.
Mein Quelltext sieht bis jetzt folgendermaßen aus:
Delphi-Quellcode:
Ein Programmierlehrer hat mir erklärt wie das mit C++ funktionieren würde. Leider kennt er sich mit Delphi überhaupt nicht aus. Das Prinzip von seinem C++-Quelltext habe ich übernommen. Es funktioniert auch ohne Fehlermeldung, leider wird mir in Edit1 nichts ausgegeben.
procedure TForm1.Button1Click(Sender: TObject);
var finder: THandle; finder2: THandle; text2: pchar; begin text1 := StrAlloc(20); finder := FindWindow('IEFrame', 'about:blank - Microsoft Internet Explorer'); if finder <> 0 then begin finder2 := FindWindowEx(finder, 0, 'msctls_statusbar32', Nil); end; if finder2 <> 0 then begin SendMessage(finder2, SB_GETTEXT, 0, LongInt(text)); end; Edit1.Text := StrPas(text2); StrDispose(text2); Kann mir da vielleicht jemand weiterhelfen? |
Re: Werte aus der Statusleiste eines fremden Programms erhal
Moin
Vielleicht sehe ich es einfach nur nicht, aber ich kann keine Stelle finden an der du "Text2" etwas zuweist. text2 willst du aber laut deinem code im edit1.text anzeigen! oder habe ich das problem nicht verstanden?? :gruebel: [edit=Sharky]Doppeposting gelöscht :stupid: Mfg, Sharky[/edit] |
Re: Werte aus der Statusleiste eines fremden Programms erhal
Okay, das war mein Fehler. Tut mir leid. Ich habe viel auskommentiert und gelöscht. Dabei hat es die falschen Textstellen erwischt.
Hier ist der richtige Text:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var finder: THandle; finder2: THandle; text: pchar; begin text := StrAlloc(20); finder := FindWindow('IEFrame', 'about:blank - Microsoft Internet Explorer'); if finder <> 0 then begin finder2 := FindWindowEx(finder, 0, 'msctls_statusbar32', Nil); end; if finder2 <> 0 then begin SendMessage(finder2, SB_GETTEXT, 0, LongInt(text)); end; Edit1.Text := StrPas(text); StrDispose(text); end; |
Re: Werte aus der Statusleiste eines fremden Programms erhal
Das wird so nicht gehen. Ein Edit oder eine Listbox kann man so auslesen aber keine Statusbar. Grund ist der es ging unter 16-Bit Windows ohne Probleme auf den Speicher eines fremden Prozesses zu zugreifen. Unter 32-Bit Windows geht das nicht mehr. Damit aber die 16-Bit Programme noch kompatible waren, hat Microsoft dafür gesorgt, dass es bei den Controlls, die noch aus der 16-Bit Zeit stammen noch geht, eben Listboxen, Edits etc. Die Statusbar, Listview, Treeview stammen aber aus der 32-Bit Zeit und da hat Microsoft keiner Veranlassung gesehen dies auch für die CommenControlls zu machen.
Unter NT ff. kannst du mit VirtuakAllovcEx dir Speicher im fremnden Prozess reservieren, mit WriteProcessMemory die Struktur üllen und dann mit ReadProcessesMemory die Struktur in eine identische Struktur im Speicher kopieren. Wie das geht habe ich mit meinen LuckieDips mit einem Listview vorgemacht. Das Programm findest du mit Source und ausführlich kommentiert auf meiner Homepage. |
Re: Werte aus der Statusleiste eines fremden Programms erhal
Zitat:
|
Re: Werte aus der Statusleiste eines fremden Programms erhal
Hi,
interessantes Thema, aber kann man sich nicht normalerwies sogar den gesamten Speicher eines Fensters ausgeben lassen? Ich weis das es mit C++ auf jeden Fall geht aber ich will das halt mit Delphi machen. |
Re: Werte aus der Statusleiste eines fremden Programms erhal
Zitat:
Das stimmt nur bedingt. Den ersten Panel der Statusbar kann man ohne VirtuakAllovcEx oder sonstiges auslesen. Und zwar so:
Delphi-Quellcode:
Man kann auch die Panels 1...n auslesen.
function GetStatusBarText(wndWindow: THandle;
StatusBarClassName: string; PanelIndex: Byte): string; const SB_GETTEXT = $0402; var WndStatusBar: THandle; StatusBarText: array[0..$FFF] of Char; begin Result := ''; WndStatusBar := FindWindowEx(wndWindow, 0, PChar(StatusBarClassName), nil); if WndStatusBar <> 0 then begin if PanelIndex = 0 then SendMessage(WndStatusBar, WM_GETTEXT, $FFF, Longint(@StatusBarText)) else SendMessage(WndStatusBar, SB_GETTEXT, PanelIndex, Longint(@StatusBarText)); Result := StrPas(StatusBarText); end; end; procedure TForm1.Button1Click(Sender: TObject); begin // Read statustext from Internet Explorer label1.Caption := GetStatusBarText(FindWindow('IEFrame', nil), 'msctls_statusbar32', 0); end; Dazu habe ich ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:58 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