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 Suche im MSDN 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?


Xion - 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 http://forum.delphi-treff.de/showthread.php?9068-SendMessage(Wnd-WM_GETTEXT...)-oder-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.


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..255of 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

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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.