Guten Tag allerseits Eine Web applikation (javascript) popt mit window.alert eine Mitteilung ein. Z.Bsp. "Die Eingabe muss mindestens 3 Zeichen enthalten". Aus meinem Windows-Programm (Visual FoxPro) will ich nun diese Mitteilung lesen. Mit FindWindow finde ich die Handle auf dieses Fenster. Mit FindWindowEx finde ich den Handle auf den (einzigen) Button. Mit GetWindowTextLength ermittle ich die Grösse des Arrays und mit GetWindowText kann ich die Caption des Buttons lesen. Aber wie komme ich an den Text ran? Versuche mit 'Label' haben nichts gebracht. (Wenn ich die Web-Applikation mit FireFox starte, dann komme ich zwar bis zum Handle des Alert-Windows, aber dort ist Ende der Fahnenstange. FindWindowEx gibt 0 zurück. Aber dies nur so nebenbei) Dank im voraus.
Sieh Dir mit dem Tool Spy++ an, welche Resourcen-ID das den Text enthaltende Static-Control hat. Darüber solltest Du auch an den Text herankommen. Bei Firefox hast Du hingegen gar keine Chance, da Firefox die GUI komplett selber strickt, d.h. es werden keinerlei von Windows zur Verfügung gestellten GUI-Elemente verwendet.
Rufus, danke für den Tip mit Spy++. Ich habe mir von http://www.catch22.net/software/winspy runtergeladen und damit das Fenster analysiert. Konnte keine Download-Seite für Spy++ finden. Gehe mal davon aus, dass dieses andere Programm keinen Unterschied macht. Der Text hat die Class Name 'Static'. Nur: wenn ich damit zugreife, gibt mit FindWindowEx als Handle Null zurück.
Der Klassenname ist nicht das, was Du suchst, sondern die Ressourcen-ID. Jedes Dialogelement hat eine Ressourcen-ID und kann über diese angesprochen werden, ein Fensterhandle kann aus dieser Ressourcen-ID mit der Win32-API-Funktion GetDlgItem(hDlg, nIDDlgItem) bestimmt werden. hDlg ist das Fensterhandle des Dialogs (hier also der Messagebox), nIDDlgItem eben jene Ressourcen-ID. Mit dem so ermittelten Fensterhandle des Static-Controls kannst Du nun GetWindowText aufrufen.
Ich muss meine obige Aussage korrigieren: FindWindowEx gibt mir die Handle korrekt zurück. Mit Spy++ sehe ich, dass die Alertbox 2 static's hat. 1. Schritt: nHwnd = FindWindowEx(nHandle, 0,"Static", 0) gibt mir die Handle auf die 1. leere Static. 2. Schritt Mit GetWindow(nHwnd , GW_NEXT ) ermittle ich den naechsten Handle. Und korrekt erhalte ich den Handle auf die Static, die meinen gesuchten Text enthaelt. 3. Aber GetWindowText gibt mir nur einen leeren String zurück. ======================= Bezugnehmend auf Dein letztes Schreiben: Ressourcen-ID habe in WinSpy++ nicht gefunden. Instance-Handle kam mir der Sache am naechsten :) aber damit gab mir GetDlgItem eine Null zurück.
O Mann o Mann. Das sind so die peinlichen Augenblicke im Leben, wo man auf die Bühne treten muss und mit flüsternder Stimme "mea culpa" sagen muss. Also meine Vorgehensweise war korrekt. Aber wenn man der Function GetWindowText das Array, worin er den Text zurückgeben soll, nicht als Referenz sondern als Value übergibt, tja ..... ... ich sag' jetzt mal nicht, wieviele Stunden mich das gekostet hat. Hier noch der korrekte Code. Ist zwar Visual FoxPro, sollte aber verstaendlich genug sein:
1 | LPARAMETERS nHandle |
2 | #DEFINE GW_NEXT 2
|
3 | LOCAL cTxt, nLng |
4 | |
5 | IF nHandle != 0 |
6 | nHandle = FindWindowEx(nHandle, 0,"Static", 0) |
7 | DO WHILE nHandle != 0 |
8 | nLng = GetWindowTextLength(nHandle) |
9 | cTxt = REPLICATE(CHR(0) , nLng +1) |
10 | nLng = GetWindowText( nHandle,@cTxt, nLng +1) |
11 | cTxt = IIF(nLng=0, "", LEFT(cTxt,nLng)) |
12 | IF !EMPTY(cTxt) |
13 | THISFORM.text1.VALUE = cTxt |
14 | ENDIF
|
15 | nHandle= GetWindow(nHandle, GW_NEXT ) |
16 | ENDDO
|
17 | ENDIF
|
Glücklicherweise musste ich nie irgendwas mit VisualFoxPro machen. Schön aber, daß ich Dir ein bisschen helfen konnte. Glühstrumpf!
Grusel, per Windows API die Fenster vom Browser einlesen um eine Webseite fernzusteuern. Schon mal überlegt was passiert wenn Patches in den Browser eingespielt werden müssen ? Bekommst du Geld dafür ?
Gerichtsvollzieher schrieb: > Schon mal überlegt was passiert wenn Patches in den Browser eingespielt > werden müssen ? Wenn du bessere Ideen hast, wie man das Problem angehen kann: ich bin ganz Ohr.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.