Neue Fenster in einem fremden Programm erfassen

17/01/2008 - 18:19 von Ulf Hillebrecht | Report spam
Hallo zusammen.
Ich arbeite an einer Software, die ein automatisches Testen von
GUI-Programmen möglich machen soll.
Nun habe ich folgendes Problem:
Ich versuche über Reflection ein mir nicht bekanntes Programm zu starten und
danach die dort auf der grafischen Oberflàche ausgeführten Nutzeraktionen
aufzuzeichnen.
Das klappt auch sehr gut, solange ich mir die Forms direkt über
Assembly.getTypes() hole und mir mit CreateInstance eine neue Instanz des
Forms erzeuge. Damit arbeite ich aber am Problem vorbei; Starte ich das
Programm direkt über den Einstiegspunkt, habe ich keine Möglichkeit mehr,
Referenzen auf die erzeugten Objekte zu erhalten.
Gibt es eine Möglichkeit, das Zielprogramm so zu modifizieren, dass ich
benachrichtigt werde, wenn ein neues Fenster entsteht?
Oder einen Weg, Zugriff auf die existierenden Objekte im Ziel zu erhalten?
 

Lesen sie die antworten

#1 Kerem Gümrükcü
17/01/2008 - 19:09 | Warnen spam
Hallo Ulf,

Gibt es eine Möglichkeit, das Zielprogramm so zu modifizieren, dass ich
benachrichtigt werde, wenn ein neues Fenster entsteht?



Ja, Du kannst einen globalen Hook setzten und alle im
Betriebssystem irgendwie erzeugten Fenster, sogar
noch vor dem anzeigen wenn Du willst abfangen und
diese wiederum hooken, aber das Problem ist, das
es nicht mehr mit .NET geht, sondern mit nativer
Programmierung und Eingriffen in den Speicher (Code
Injektion, IAT-Mofifikation, etc), aber grundsàtzlich
machbar, wobei dir in 99% aller Falle ein Virenscanner
oder eine andere Sicherheitssoftware dazwischengeht,
die wiederum die Zugriffe auf die Windows API und
bestimmte Bereiche in PE Dateien aus dem Windows Kernel
überwacht und dein Programm als mögliche Gefahr meldet,...

Ich habe Dir mal einen Screenshot gemacht, von einem Programm,
das ich geschrieben habe und damit dynamisch Funktionen in
Zielprogrammen mit meinen Einsprungspunkten ersetzte und die
Windows API nach bedarf filtern kann:

http://entwicklung.junetz.de/pics/hook.jpg

Du kannst die ausgabe Rechts im Fenster des DbgView's sehen, das die
Klassen aller Fenster anzeigt, die mein Programm abgefangen hat. Darunter
auch die Klassen von .NET Fenstern.

Du kannst mit einem globalen Hook alle Fenster im System
abfangen und auslesen!

Ich kann Dir jetzt keinen konkreten Link geben und sagen,
"das ist gut", sondern Du musst die für dich beste Methode
suchen: suche im Netz nach "Hooking API", "Sublcassing"
und so Begiffen,...

Aber bei www.codeproject.com wirst Du sicher was gutes finden!

Sollte aber hooking für dich erst mal zu kompliziert sein, kannst
Du diese Library von mir benutzen, mit der Du ein beliebiges
Zielfenster Hooken kannst und dann Windows Nachrichten
abfangen, wie z.B. die Benachrichtigung bei der Erzeugung
eines neuen Femsters:

http://entwicklung.junetz.de/projec...ibrary.dll

Eigentlich ist die Klasse für die Common-Dialogs gemacht, aber ich habe
Helper Funktionen eingebaut, mit denen Du "extras" hast wie zusàtzliche
Hooking-Möglichkeiten beliebiger Fenster. Schau Dir dazu die
Klasse "CommonDialogHooking" an, die sich eigentlich von selber erklàrt.
Nachrichten zu Windows findest Du unter "WindowsAPIClass.WindowsMessages"
Wenn Du Fragen hast, stelle sie einfach...

Grüße

Kerem

Beste Grüsse / Best regards / Votre bien devoue
Kerem Gümrükcü
Microsoft Live Space: http://kerem-g.spaces.live.com/
Latest Open-Source Projects: http://entwicklung.junetz.de
"This reply is provided as is, without warranty express or implied."

Ähnliche fragen