Forum: PC-Programmierung Den Text einer Messagebox ermitteln


von Mehmet K. (mkmk)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Mehmet K. (mkmk)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Mehmet K. (mkmk)


Angehängte Dateien:

Lesenswert?

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.

von Mehmet K. (mkmk)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Glücklicherweise musste ich nie irgendwas mit VisualFoxPro machen.

Schön aber, daß ich Dir ein bisschen helfen konnte.

Glühstrumpf!

von Mehmet K. (mkmk)


Lesenswert?

Das mit Spy++ war eine sehr grosse Hilfe. Danke nochmals.

von Gerichtsvollzieher (Gast)


Lesenswert?

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 ?

von Mehmet K. (mkmk)


Lesenswert?

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
Noch kein Account? Hier anmelden.