Probleme zu FindWindowEx?
-
Hallo,
ich habe folgendes problem und zwar, möchte ich vom Internet Explorer ein Textfeld auslesen, diese in Java also Canvas drin steckt.
Ich habe mir dazu WinSpy 2008 gedownloadet um die richtige Controls anzuzeigen:
ScreenLeider erzeugt das Programm nur Delphi-Code und habe erstmal die HANDLES in C++ umgeschrieben:
HWND wndMain = FindWindow("IEFrame","Chat - Knuddels.de - Windows Internet Explorer"); HWND wndChild = FindWindowEx(wndMain, 0, "TabWindowClass", NULL); wndChild = FindWindowEx(wndChild, 0, "Shell DocObject View", NULL); wndChild = FindWindowEx(wndChild, 0, "Internet Explorer_Server", NULL); wndChild = FindWindowEx(wndChild, 0, "Java Plug-in Control Window", NULL); wndChild = FindWindowEx(wndChild, 0, "SunAwtFrame", NULL); wndChild = FindWindowEx(wndChild, 0, "SunAwtCanvas", NULL); wndChild = FindWindowEx(wndChild, 0, "SunAwtCanvas", NULL); wndChild = FindWindowEx(wndChild, 0, "SunAwtCanvas", NULL); wndChild = FindWindowEx(wndChild, 0, "SunAwtCanvas", NULL); wndChild = FindWindowEx2(wndChild,"SunAwtCanvas", 2); wndChild = FindWindowEx(wndChild, 0, "SunAwtCanvas", NULL); wndChild = FindWindowEx2(wndChild,"SunAwtCanvas", 2); wndChild = FindWindowEx(wndChild, 0, "Edit", NULL);
Das problem ist jetzt mit "FindWindowEx2", ich habe zwar die Function von FindWindowEx2, aber für Delphi und habe versucht, diese Function in C++ umzuschreiben, es läuft zwar, aber ich bekomme als HANDLE immer den Wert 0.
Hier ist der Delphi-Code:function FindWindowEx2(hParent: HWND; ChildClassName: string; ChildNr: Word): HWND; var i: Word; hChild: HWND; begin hChild := 0; Result := 0; Dec(ChildNr); for i := 0 to ChildNr do begin hChild := FindWindowEx(hParent, hChild, PChar(ChildClassName), nil); if hChild = 0 then Break; Result := hChild; end; end;
und hier habe ich den Code für C++ umgeschrieben:
HWND FindWindowEx2(HWND hParent, String ChildClassName, WORD ChildNr) { WORD i; HWND hChild; hChild = 0; ChildNr--; for (i=0; i<ChildNr; i++) { hChild = FindWindowEx(hParent, hChild, ChildClassName.c_str(), NULL); if (hChild == 0) { break; } return hChild; } }
Ich wäre euch sehr dankbar, wenn mir da einer helfen könnte.
MfG
-
Mir ist folgender Fehler aufgefallen.
Aus dem hier
Dec(ChildNr); for i := 0 to ChildNr do begin
wird nicht das:
ChildNr--; for (i=0; i<ChildNr; i++) {
sondern das:
ChildNr--; for (i=0; i [b]<=[/b] ChildNr; i++) {
Wenn du einfach ein < verwenden willst, kannst du dir das
ChildNr--
auch sparen.
-
Vielen Dank für die antwort.
Also, ich habs mal so gemacht mit kleiner oder gleich, aber es geht immer noch nicht.
Das Fenster wurde gefunden, aber das Textfeld nicht.Kann das sein, das diese Function in C++ anders arbeitet als in Delphi?
Wenn ja, wie könnte ich das problem ambesten lösen?Edit: Oder ich lagere diese Function in einer DLL Datei aus, in Delphi und importiere diese DLL Datei dann in C++, vieleicht könnte das dann funktionieren oder was meint ihr?
MfG
-
bruce85 schrieb:
Kann das sein, das diese Function in C++ anders arbeitet als in Delphi?
Nein. Die rufen beide die gleichen Windows API Funktionen auf.
bruce85 schrieb:
Edit: Oder ich lagere diese Function in einer DLL Datei aus, in Delphi und importiere diese DLL Datei dann in C++, vieleicht könnte das dann funktionieren oder was meint ihr?
Hast du denn schon mal geschaut, ob die Funktion in Delphi überhaupt das tut, was du von ihr willst?
Btw. hab noch einen Fehler gefunden.
dein
return hChild;
ist auch noch Falsch.
HWND FindWindowEx2(HWND hParent, String ChildClassName, WORD ChildNr) { WORD i; HWND hChild; HWND rv; hChild = 0; for (i=0; i<ChildNr; i++) { hChild = FindWindowEx(hParent, hChild, ChildClassName.c_str(), NULL); if (hChild == 0) { break; } rv = hChild; } return rv; }
Wäre richtig.
-
Vielen Dank.
In Delphi habe ich das ja getestet und es ging.
Habe gerade die DLL Datei fertig gemacht aber den fehler, den du mir korrigiert hast, ist perfekt, nun funktioniert es.
Ich Danke Dir vielmals für die Hilfe.
MfG
-
Aber nicht vergessen,
HWND rv;
zu initialisieren
-
Danke.
Wie soll ich es denn Initialisieren, meinst du einen standard Wert in rv ablegen?Sry, ich arbeite mehr mit Delphi als mit C++ und lerne schon seit paar Monaten C und habe auch schon einige kenntnissen in C++.
Ich habe noch eine Frage und zwar, wie lese ich Passwordfelder aus?
Keine angst, ist nur zum Testzwegen gedacht.Ich kann nur normale Textfelder auslesen, aber keine Passwordfelder, ich bekomme einen leeren Text zurück geliefert.
String MsgOutput(HWND hwndChild) { int nLen = SendMessage(hwndChild, WM_GETTEXTLENGTH, 0, 0); char *pText = new char[nLen]; SendMessage(hwndChild, WM_GETTEXT, (WPARAM)nLen+1, (LPARAM)pText); return pText; }
Vielen Dank schonmal.
MfG