wie funktioniert EnumChildWindows?
-
Hallo,
ich schaffe es mit findwindow mein parenthandle des gesuchten Fensters zu bekommen, dann möchte ich den handle einer bestimmten Klasse bekommen. Also rufe ich EnumchildWindow auf und über enumchildproc werden alle Childhandles durchlaufen und mit getclassname die dazugehörige Klasse ermittelt, nur leider verstehe ich nicht, wenn ich jetzt meine gewünschte Klasse gefunden habe,wie ich aus der Callbackfunktion enumchildproc heraus nun arbeiten kann?
Das Verständnis dieser Callbackfunktionen habe ich nicht. Wie bekomme ich aus der enumchildproc-funktion meinen handle der gesuchten Klasse?
Wenn enumchildproc nicht weiter nach Childs "suchen" soll dann muss man 0 returnen, nur was bringt es mir bei EnumChildWindows?
int main(){ HWND hparent,hchild; hparent = FindWindow(L"WindowsForms10.Window.8.app.0.141b42a_r14_ad1",L"blaa"); if(hparent == NULL) { printf("Window cannot be found!\n"); return 1; } else{ childscounter=0; EnumChildWindows(hparent, enumchildproc, 0); } return 0; } int _stdcall enumchildproc(HWND hwnd, long lParam) { char name[200]; char classname[200]; childscounter++; if(GetClassName(hwnd,classname,200)) printf("%d %s\n",hwnd, classname); // hier fehlt noch ein Vergleich der gesuchten und gefunden Klasse! // wenn der passende Handle gefunden wurde, wie bekomme ich ihn zurück in die main? return 1; }
-
Und warum machst DU es so kompliziert mit EnumChildWindows. Es geht auch ganz einfach mit GetWindow. Ich habe noch nie verstanden warum alle Welt eine Funktion mit Callback einer einfachen Funktion vorzieht.
https://msdn.microsoft.com/en-us/library/windows/desktop/ms633515(v=vs.85).aspx
Zu Deiner Frage:
Wenn Die Callback Funktion das Fenster gefunden hat, kann Sie Ihr Ergebnis in einem Zeiger (lParam) speichern und terminieren. Die unterliegende Prozedur nimmt das Ergebnis und arbeitet damit.
-
HWND hwnd = 0; EnumChildWindows(hparent, enumchildproc, reinterpret_cast<LPARAM>(&hwnd));
Und jetzt darfst du 1x raten wie dann der Code in
enumchildproc
dazu aussehen sollte
-
Siehe #Post 2:
http://www.codeexperts.com/showthread.php?449-How-to-enumerate-all-the-child-windows-of-given-Window-using-WIN32-API
-
Martin, deine Bsp mit getwindow haben gut funktioniert, ich habe sie auch benutzt, nur möchte ich diese callbacks verstehen
Hustbaer, google sagt zu reinterpret cast es sein ein "mächtiger" cast, bitte berichtigt mich, aber lparam ist ein 4byte int und long 8byte kann es da nicht probleme geben?
MrC diese bsp habe ich mir auch angesehen. Meist wird in enumchildprog nur der handle ausgegeben o.ä. ich möchte aber die handles zurückgeben zur main und sie in einem array speichern zB.
Mir ist auch nicht klar wieso man enumchildproc keine Argumente übergeben muss.
-
LPARAM ist ein LONG_PTR, also ein integral mit derselben größe wie ein zeiger.
-
Grundlagen, mist
-
EnumChildWindow kann Benutzerdaten in Form eines Zeigers bekommen.
Wenn das also ein Zeiger auf einen Array ist, kann EnumCHildWindow alle Daten dort entsprechend ablegen.Alle solche Callback Funktionen verfügen über irgendeine Form von Handle oder LPARAM, mit dem man einen Zeiger weitergeben kann.
-
Dummbrot mein link war nur Ansatz zum Ziel. Mit Arrays solltest du alleine hin bekommen. In enumproc handle ubergeben ?? Hmm, du kannst in enumproc handles in arrays packen.
-
ich bekomme es nicht hin
diesmal nicht mit enumchildwindows sondern mit enumwindows. Vielleicht kann mir jemand nochmal den Ablauf erklären
EnumWindows(EnumWindowsProc,reinterpret_cast<LPARAM>(¶m));
Enumproc wird ohne Argumente aufgerufen(warum auch immer), obwohl es einen HWND und LPARAM als Argument benötigt, beide werden byvalue aufgerufen, also ist nichts mit zurückgeben irgendwelcher Werte aus Enumproc.
Das zweite Argument von EnumWindows ist ein LPARAM der so wie Martin meint zum Sammeln der Handles da wäre, nur ist der Wert immer unverändert bei mir. Ich weis nicht wie ich ihm anweisen kann dort die Handles abzulegen.mir scheint als wenn keiner bei google oder hier in der Suche sowas gemacht hat, in den Bsp werden die LPARAMs nie benutzt.
#Frust
-
HWND param; EnumWindows(EnumWindowsProc,reinterpret_cast<LPARAM>(¶m));
int _stdcall EnumWindowsProc(HWND hwnd, long lParam){ wchar_t buf[200]={0}; lParam=(long)hwnd; GetWindowText(hwnd,buf,199); printf("hwnd: %X lParam: %d Title: %ls\n",hwnd,lParam,buf); return 1; }
-
lParam ist ein Zeiger. Also benutze ihn und setze nicht lParam neu.
*reinterpret_cast<HWND*>(lParam) = hwnd;