www.mikrocontroller.net

Forum: PC-Programmierung Den Text einer Messagebox ermitteln


Autor: Mehmet Kendi (mkmk)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mehmet Kendi (mkmk)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mehmet Kendi (mkmk)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Mehmet Kendi (mkmk)
Datum:

Bewertung
0 lesenswert
nicht 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:
LPARAMETERS nHandle
#DEFINE GW_NEXT 2
LOCAL cTxt, nLng

IF nHandle != 0
  nHandle = FindWindowEx(nHandle, 0,"Static",  0)
  DO WHILE nHandle != 0
    nLng = GetWindowTextLength(nHandle)
    cTxt = REPLICATE(CHR(0) , nLng +1)
    nLng = GetWindowText( nHandle,@cTxt, nLng +1)
    cTxt =  IIF(nLng=0, "", LEFT(cTxt,nLng))
    IF !EMPTY(cTxt)
      THISFORM.text1.VALUE = cTxt
    ENDIF
    nHandle= GetWindow(nHandle, GW_NEXT )
  ENDDO
ENDIF

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Glücklicherweise musste ich nie irgendwas mit VisualFoxPro machen.

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

Glühstrumpf!

Autor: Mehmet Kendi (mkmk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das mit Spy++ war eine sehr grosse Hilfe. Danke nochmals.

Autor: Gerichtsvollzieher (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Mehmet Kendi (mkmk)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.