| Autor |
Beitrag |
r4in
Hält's aus hier
Beiträge: 6
|
Verfasst: Fr 06.08.10 17:17
Hi Leute,
hat jemand ein Script zum auslesen einer fremden MessageBox wenn der Titel der Messagebox bekannt ist?
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: 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
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
r4in 
Hält's aus hier
Beiträge: 6
|
Verfasst: 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?
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Fr 06.08.10 17:56
Hmm, also an den Button komm ich ran:
Delphi-Quelltext 1: 2: 3:
| h:=FindWindow(nil,'Fernsehzeitung'); h:=FindWindowEx(h,0,'TButton',nil); ShowMessage(GetText(h)); |
Die GetText Funktion hab ich von forum.delphi-treff.d...lieber-GetWindowText
Man kriegt den FindWindowEx vielleicht auch dazu dass er alle "Komponenten" der Reihe nach liefert, durch mehrmaliges aufrufen...aber ich habs nicht geschafft auf Anhieb.
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
jaenicke
      
Beiträge: 19340
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: 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
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
jaenicke
      
Beiträge: 19340
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: 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:
www.delphitricks.com...rrent_mouse_pos.html
Der zeigt auch, dass es dort kein Label gibt, denn alles dort heißt "TMessageForm".
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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.
|
|
|