Problem mit FindWindowEx! Bitte helfen!
-
Hallo,
Wie komm ich per FindWindowEx an eine Toolbar von FileZilla ran und danach an die Editbox?
Kann man iwie den Handle-Zahlencode zum suchen übergeben? Weil die Edit-Felder keine Namen haben und die Klassen alles gleich lauten.
char buffer[MAX_PATH]; char *message = "hallo"; sprintf(buffer, "%s", message); HWND fcWindow = FindWindow("wxWindowClassNR", NULL); while(!fcWindow) { printf("Waiting for Window"); } if(fcWindow) { printf("Window FOUND!"); HWND fcWindow2 = FindWindowEx(fcWindow, NULL, "wxWindowClassNR", "ID_QUICKCONNECTBAR"); if(fcWindow2) { printf("QuickConnectBar FOUND!"); //SendMessage(fcWindow2, WM_SETTEXT, 0, (LPARAM)buffer); } } system("PAUSE"); return 0;HIER MAL EIN AUSZUG AUS DEN KLASSEN VON FIREFOX
http://i35.tinypic.com/2wlyesl.jpgFür jegliche Antworten wär ich unglaublich dankbar, weil mir das sehr wichtig ist.
Danke!
-
Fällt dir was auf? Du schreist laut nach einer Antwort, und im Moment ist dein Thread genau der einzige aktuelle Thread, der KEINE Antwort hat. Woran das liegen mag?
Lies dir mal den Link in meiner Signatur durch. Vor allem beim dritten und vierten Punkt sollte dir was auffallen.
-
Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Also ich denke es wird kein Unterschied machen, ob ich schreibe "FindWindowEx findet das Editfeld nicht" oder "habe ein Problem mit FWE". Letztendlich sind die Leute angesprochen, die sich damit jemals beschäftigt haben.
Stimmt, mit dem Forum hatte ich mich geirrt!
-
eine Liste aller Childwindows wäre doch schonmal ein anfang:
BOOL CALLBACK EnumProc(HWND hwnd, LPARAM lparam) { WCHAR name [1000]; GetWindowText(hwnd, name, 1000); basic_string<wchar_t> n; cout<<"Fenstername: "; wprintf(n.c_str()); cout<<"\nHWND: "<<hwnd<<"\n\n"; return true; } int main() { cout<<"Fensterliste:\n\n"; HWND parent;//hwnd des parent EnumChildWindows(parent, EnumProc, 0); }(notfalls könntest du die nachricht ja an jedes childwindow gleich in der enumproc schicken)
lg, andi01.
-
Interessante Sache! Allerdings gibt er auf den ersten Blick ja nur die Fenster die offen sind aus. Die Childwindows ignoriert er. Mit ein bisschen umschreiben könnte man das sicherlich auch gut nutzen.
Aber ich hab die Lösung schon selber gefunden, die gute alte msdn hat mir da weitergeholfen:Der zweite Parameter von FindWindowEx:
hwndChildAfter [in, optional]
HWNDA handle to a child window. The search begins with the next child window in the Z order. The child window must be a direct child window of hwndParent, not just a descendant window.
Trotzdem danke !
-
Marineblau schrieb:
Allerdings gibt er auf den ersten Blick ja nur die Fenster die offen sind aus. Die Childwindows ignoriert er
das sollte eigentlich nur passieren wenn du als parent-hwnd 0 angibst.
wenn du aber das handle eines fensters angibst werden alle childwindows aufgelistet.Diese Prozedur ist dazu gedacht alle childs eines Parents aufzulisten.
ich würde sagen du hattest einfach vergessen das hwnd parent(Z.18) so umzuschreiben dass die variable das hwnd deines parents enthält, z.B. für notepad::
HWND parent=FindWindow(0, TEXT("Unbenannt - Editor"));hier zB mal ein Codebeispiel für Notapad (hat nur 2 childs):
BOOL CALLBACK EnumProc(HWND hwnd, LPARAM lparam) { if(!IsWindow(hwnd))//abbruch wenn kein childwindow { return true; } if(!IsWindowVisible(hwnd))//abbruch wenn child unsichtbar { return true; } WCHAR name [1000]; GetWindowText(hwnd, name, 1000); basic_string<wchar_t> n; cout<<"Childname: "; wprintf(n.c_str()); cout<<"\nHWND: "<<hwnd<<"\n\n"; return true; } int main() { cout<<"Fensterliste:\n\n"; HWND parent=FindWindow(0, TEXT("Unbenannt - Editor"));//hwnd zu editor, dem parent EnumChildWindows(parent, EnumProc, 0);//listet alle childs von editor auf }in diesem Codebeispiel werden alle Childwindows (genau 2) von notepad aufgelistet (vorausgesetzt natürlich dass editor geöffnet wurde).
für den Fall dass du 0 als parent HWND angiebst werden alle parents aufgelistet (weil diese wiederrum childs vom desktopwindow sind welches überlicherweise das hwnd 0 hat)
Aber das war ja auch nur der Ansatz um erstmal alle childwindows aufzulisten^^
lg,
andi01.
-
Hmmm, wird immer interessanter die Sache. Ich hatte natürlich das Window-Handle von FindWindow übergeben, wie du es gemacht hast, was aber bei mir auf den ersten Blick nicht geklappt hat, weil nachdem ich Sendmessage mit eingebaut habe, hatten plötzlich alle meine offenen Fenster den Titel "hallo"
die childWindows jedoch waren unbefüllt....Hab aber mal eben die Handle-Codes die er ausgibt mit denen von Spy++ verglichen und sie sind tatsächlich gleich. Hätte klappen sollen, aber whatever. Trotzdem hilfreich die Funktion EnumChildWindows u. EnumProc, werde ich sicherlich auch noch brauchen für mein Vorhaben, deshalb bigthx!
-
ich kann dir auch sage woran das mit den "komischen" titeln lag xDD
WM_SETTEXT bewirkt genau das Setzen von Fenstertiteln; Da du aber offenbar ein falsches parentwindow-hwnd angegeben hast(kann ja zB auch nur ein tippfehler im fenstertitel sein, das reicht für einen unbrauchbaren rückgabewert) wurden alle parents genommen statt alle childs weil zu dem entsprechenden parent-hwnd kein parent-fenster gefunden wurde...
erklärung dafür stand ja schon oben: fast alle fenster sind childs vom desktop, und diese childs (die "normalen" fenster) können wieder childs haben und (rein theoretisch) kann diese childreihe so weitergehen.
wenn man jetzt also ein ungültiges parenthandle übergibt oder es mit 0 initialisiert (0=hwnd desktop), dann wird der desktop als parent genommen und eben alle parents des desktops aufghezählt(nämlich die "normalen" fenster)
wenn du ein Zeichen zB an eine textbox senden willst würde ich WM_CHAR und im WPARAM das entsprechende Zeichen übergeben^^
also kurzfassung: gültiges parent-hwnd übergeben und statt WM_SETTEXT lieber WM_CHAR und im WPARAM das Zeichen das gesendet werden soll.
Bsp:
HWND child; SendMessage(child, WM_CHAR, "a", 0);//sendet das zeichen "a" an das childedit: hier noch ein kleines Beispiel für eine sendemethode:
void senden(char zeichenkette[], HWND child) { for(int a=0;a<zeichenkette.length();a++) { SendMessage(child, WM_CHAR, zeichenkette[a], 0); } }lg,
andi01.
-
Das klingt logisch, könnte sogar gut sein, fällt mir gerade ein!
Aber dann wär mir
if(hwnd == "0x0215ae") // Passenden Child finden, in dem Fall das Editfeld { SendMessage(hwnd, WM_SETTEXT, 0, (LPARAM)buffer); }lieber. sollte doch auch klappen...Weil über FindWindow und WM_SETTEXT befüllt er das Editfeld auch.
-
sollte doch auch klappen
ja, funktioniert auch... meine Methode war ja eigentlich auch nur dazu gedacht alle childwindows auszulisten

und bei einem gültigen parent-hwnd kommen auch nur dessen childs.
denn wenn man die parents auflisten will gibts dafür ne eigene methode:
EnumWindows(EnumProc, 0);//EnumProc von Beitrag oben unverändertlg,
andi01.