Bin zufälligerweise auf diesen Beitrag gestoßen: http://www.rgh-soft.de/forum01/read.php?f=7&i=15634&t=15634
Ich nehme an, dass XProfan's FindFindow die API FindWindow verwendet.
Die API FindWindow hat ein großes Problem: Sie verwendet die API GetWindowText. GetWindowText wiederum sendet die Message WM_GETTEXT - und da hakt die Sache. Wird die Message nicht richtig von einer Fensterprozedur bearbeitet (und auf manchen Rechnern ist das der Fall), kehrt SendMessage nicht zurück und das Programm kackt ab. Bin da vor einigen Jahren drauf gestoßen, als ich Tasks and Token geschrieben habe.
FindWindow hängt sich auf
-
-
-
War mir nie aufgefallen. Wäre ja interessant zu wissen, weshalb manche Rechner so reagieren.
-
Wie gesagt, manche Fenster bearbeiten WM_GETTEXT nicht oder nicht richtig, das ist der Grund.
-
SendMessage wartet ja auf die Rückantwort aus der Windowproc - die kommt aber in dem Fall nie.
Hier Was zum Testen:Code
Alles anzeigenDeclare X& Print FindWindow("Test") X& = 1 While x& > 0 Locate 0,0 IF External("User32", "IsWindow", x&) = 1 Print str$(X&)+"="+Gettext$(x&)+Space$(300) Else Print str$(X&)+Space$(300) endif X& = X& +1 EndWhile
Hier das gleiche etwas erweitert:Code
Alles anzeigenDeclare X&, Buffer# Print FindWindow("Test") X& = 1 While x& > 0 Locate 0,0 IF External("User32", "IsWindow", x&) = 1 DIM Buffer#, 20001 External("User32", "GetClassNameA", x&, Buffer#, 20000) Print str$(X&)+"="+String$(Buffer#,0) Dispose Buffer# Print str$(X&)+"="+Gettext$(x&)+Space$(300) Else Print str$(X&)+Space$(300) Print Space$(300) endif X& = X& +1 EndWhile
-
Ich würde da hinter XProfans FindWindow eher ein EnumWindows vermuten. Denn XProfan kann ja nach Anfängen der Titel suchen. Die API FindWindow erwartet aber immer einen vollständigen Fensternamen mit oder ohne Klassenbezeichner oder nur einen Klassenbezeichner und liefert dann ein passendes Fenster. Da fällt mir nicht so richtig ein, wie ich da ein Fenster nach einem vorgegebenen Titelanfang rausfischen könnte.
Gruß Volkmar
-
Bleibt sich gleich - Problem ist das Senden von WM_GETTEXT, mit dem der Fenstertext ermittelt wird (siehe Quelltext oben).
-
Bei dem Quelltext oben ist es ein Fenster des Betriebsystems, dass normalerweise nicht mitgelistet wird (das ist für den User eigentlich gar nicht vorhanden), bei dem WM_GETTEXT hakt (hab dort der Einfachheit halber GetText$ verwendet). Das kann natürlich auch bei unsichtbaren Fenstern so sein, die eine Anwendung erzeugt. In dem Fall würde alles haken, was mittels SendMessage nach Fenstertiteln sucht.
-
...wenn man also systemweit etwas per Messages auslesen oder untersuchen möchte, sollte man das nicht mittels SendMessage tun, sondern mittels SendMessageTimeout, das kehrt nach einer Wartezeit zurück und hakt nicht.
-
...und wenn man nicht auf ein Ergebniss angewiesen ist, ist PostMessage schneller als SendMessage. Das setzt die Message ab und kehrt dann sofort zurück.
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!