FindWindow und SendMessage?
-
Ich hab die Dateien geladen, aber ich finde nur folgendes (geht trotzdem net):
SendMessage(y,BM_SETCHECK,BST_CHECKED,0);
An application sends a BM_SETCHECK message to set the check state of a radio button or check box.
-
Was ist y
-
Ups. hier:
y = ::FindWindowEx(x, NULL, TEXT("TRadioButton"), "I &accept the agreement");
-
Und das Handle, das du bekommst ist gültig?
-
Ja schon (Rückgabewert: HWND). Aktivieren des Fensters/RadioButtons ist Problemlos möglich. Nur ich krieg das mit den Messages nicht hin, damit es "gechecked" wird.
-
Komisch. Bei mir im C++Builder funzt
SendMessage(RadioButton1->Handle, BM_SETCHECK, BST_CHECKED, 0);
wunderbar.
-
SendMessage(WM_SETFOCUS,0,0);
geht ohne prob. Aber dein Befehl (obwohl logischer) geht bei mir net. Oder vielleicht ist das bei verschiedenen Programmen unterschiedlich.
-
Hi. Ich habe zu meinem älteren Beitrag noch eine Frage, die mir Kopfzerbrechen bereitet: Wie finde ich eine Edit-Box (mit FindWindowEx)? Denn eine EditFeld hat eigentlich keine Bezeichnung, wie z.B. ein Fenster oder so. Deswegen komme ich mit
newwin = ::FindWindowEx(findwin, NULL, TEXT(""), "Edit");
immer nur an das erste EditFeld. Mit
::SendMessage(findwin, WM_NEXTDLGCTL, 0, 0);
komm ich auch net weiter.
-
EnumChildWindows oder bei FindWindowEx eifanch jeweils für hwndChildAfter den Fenster-Handle des vorhergehenden Aufrufs einsetzen
-
Irgendwie steh ich aufn Schlauch! Das ich irgendwie mit EnumChildWindow rankomme, hab ich schon halbwegs begriffen. Aber ich habe keine Vorstellung wie das gehen soll.?
-
Du müsstest eben wissen, das wievielte Child es ist, oder evtl. hilft dir GetDlgCtrlID weiter
-
Na ja, mit Spy sehe ich welche SteuerelementID welches EditFeld hat. Ich weis nur nicht, wie ich das programmieren soll, damit ich global auf ein gefundenes Element zugreifen kann. Meine HWND-Variable die aus FindWindow entsteht, ist global angelegt, um damit in verschiedenen Befehlen darauf zugreifen zu können - Local wäre es ja am Ende des Befehls weg.
Also brauche ich eine Möglichkeit irgendwie meine Variable auf das neue Fenster zu verweisen. Die Frage ist nur wie?
Das mit GetDlgCtrlID habe ich schon versucht, aber irgendwie kommt immer Programmabsturz. Die Nummer vom ChildWindow - mmmh - kann ich die mit Spy irgendwie selbst ausrechnen?
-
Also eine Zugriffsverletzung solltest du bei GetDlgCtrlID eigentlich nicht bekommen
- wie hast du es denn versucht?
-
BOOL CALLBACK EnumChildWindowsProc(HWND hwndChild, LPARAM lParam) { int id = GetDlgCtrlID(hwndChild); switch(id) { case ID_EDIT_1: DoSomething(); break; . . . } return FALSE; } EnumChildWindows(hwnd, // Das Parent der Edits EnumChildWindowsProc, // Die Callback-Funktion 0); // Kein Parameter
So geht das mit EnumChildWindows(). Aber wenn du die Control IDs eh hast, dann reicht doch auch ein GetDlgItem(), oder?
-
Danke für deine Antwort. Das probiere ich heute Abend aus. Da ich von meinem Programm aus, in einem externen Fenster "rumklicken" möchte, kenne ich die Bezeichnung (z.B.:ID_EDIT_1) nicht. Denke ich richtig, wenn ich das gegen die SteuerungsID von Spy ersetze?
Ich habe schon mit GetDlgItem() experimentiert, nur bekomme ich nie den Zeiger auf das richtige Element -> meist Absturz (oder weis net wie es richtig geht
).
-
Du musst GetDlgItem einfach das Hanlde des Parent-Windows und die ID (hierbei musst du eben beachten, dass die Steuerelement-ID in Hex-Form gegeben ist)
-
Ich glaub jetzt hab ich es:
HWND oldwin; //Variable ist das Hauptfenster und schon vorher festgelegt HWND findwin; int dlgid; CString hextxt="4756"; CString changetxt="Beispiel"; sscanf(hextxt,"%x",&dlgid); findwin=::GetDlgItem(oldwin,dlgid); wnd.Attach(findwin); wnd.SetFocus(); if (changetxt!="") { wnd.SendMessage(WM_SETTEXT,0,(LPARAM)(LPCSTR) changetxt); } wnd.Detach();
Hier wird nun das Editfeld mit der SteuerID (0x4756) gesucht und ein Zeiger darauf gesetzt. Danach wird gleich der Fokus ein das Feld geschickt. Sollte bei changetxt etwas stehen, dann wird dieser Text eingefügt.