Entwickler-Ecke
Windows API - Fremde MessageBox auslesen wenn Titel bekannt
r4in - Fr 06.08.10 17:17
Titel: Fremde MessageBox auslesen wenn Titel bekannt
Hi Leute,
hat jemand ein Script zum auslesen einer fremden MessageBox wenn der Titel der Messagebox bekannt ist?
elundril - Fr 06.08.10 17:26
Sollte eigentlich auch mit
FINDWINDOW funktionieren. Grad mit 2 Programmen getestet (in einem mit Showmessage ein Fenster erzeugt mit dem titel 'findmich', und im anderen das fenster mit dem titel 'findmich' geschlossen).
lg elundril
r4in - Fr 06.08.10 17:30
hmm wenn ich mir die msgbox mit WinSpector anschaue, bekomm ich den Text niht ausgegeben, nur die Überschrift...
kann man eine msgbox vorm auslesen präzise schützen?
jaenicke - Sa 07.08.10 04:40
Ich glaube nicht, dass die Messageboxen von Windows irgendwelche visuelle Komponenten zur Textdarstellung benutzen. Deshalb wird man da über die Standardwege zum Auslesen von Komponenten nicht weiterkommen.
Wenn also die Messagebox nicht auf WM_GETTEXT reagiert, wird es schwieriger.
// EDIT:
Gerade getestet:
Bei einem ShowMessage ist z.B. nur der Button im Fenster, der Text wird direkt gezeichnet wie vermutet.
elundril - Sa 07.08.10 07:05
Würde eigentlich der Text an einer fixen stelle im Speicher des Fensters stehen (als String muss er ja irgendwie gespeichert sein im RAM)? Weil dann könnte man ja eigentlich zum Anfang vom Speicher des Fensters einfach das Offset dazuaddieren und den String auslesen, oder mach ich mir da grad das etwas zu einfach?
lg elundril
jaenicke - Sa 07.08.10 07:52
Sowas funktioniert schon, aber da es je nach Programmiersprache usw. unterschiedlich ist funktioniert das nur, wenn das Zielprogramm bekannt ist und man dort schauen kann wo es steht.
Ich habe im Quelltext von Delphi aber einmal geschaut. Da wird ein Label mit Namen Message erstellt. Dieses zeigt WinSpy aber nicht an (danach war ich gegangen). Dennoch sollte man da herankommen. Ich habe es nicht weiter ausprobiert.
Xion - Sa 07.08.10 08:56
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| var h: THandle; A,x: integer; aName: array [0..255] of Char; begin h:=FindWindow(nil,'Fernsehzeitung'); x:=0; for A:= 0 to 10 do begin aName:=''; x:=FindWindowEx(h,x,nil ,nil); GetClassName(x, aName, 256); ShowMessage(GetText(x)+' - '+string(aName)); end; end; |
So hab ich mir das vorgestellt (man kommt aber trotzdem nicht an das Label ran) ;)
Hier ist übrigens ein toller Code zum aufspüren von Klassennamen:
http://www.delphitricks.com/source-code/windows/get_handle_and_class_name_from_the_current_mouse_pos.html
Der zeigt auch, dass es dort kein Label gibt, denn alles dort heißt "TMessageForm".
Delete - Sa 07.08.10 09:00
jaenicke hat folgendes geschrieben : |
| Ich habe im Quelltext von Delphi aber einmal geschaut. Da wird ein Label mit Namen Message erstellt. Dieses zeigt WinSpy aber nicht an (danach war ich gegangen). Dennoch sollte man da herankommen. Ich habe es nicht weiter ausprobiert. |
Dann kann das aber nur ein VCL-Dialog gewesen sein. Darunter fällt auch der ShowMessage-Dialog aus der Unit Dialogs der VCL. Eine normale Messagebox wird von Windows erzeugt und da müsste der Text in einem Fenster der Klasse STATIC stehen. Das Label gibt es nur in der VCL und da es kein Handle hat, da es von TGraphicControl abgeleitet ist und von der VCL selber gezeichnet wird, kommt man über WM_GETTEXT auch nicht an den Text dran.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!