TOpenDialog vom Programm aus schließen
-
Hallo,
Danke für den Tipp. Das mit dem Handle von dem Parent->Fenster ist natürlich richtig und den Handle für den Open-Dialog kriegt man viel einfacher über OpenDialog->Handle.
Würde jetzt also so aussehen:
Button-Handle = FindWindowEx(OpenDialog->Handle,NULL,"Button","Abbrechen");
Bleibt immer noch die Frage, wie vermittle ich dem OpenDialog, dass er sich jetzt schließen soll ?
Hier drei Versuche die nicht funktionieren:
`reinterpret_cast<TButton *>(Button-Handle)->Click();
..
EndDialog(OpenDialog->Handle,0);
..
PostMessage(OpenDialog->Handle, WM_COMMAND, MAKELONG(IDABORT, BN_CLICKED), 0L);`
-
Probiere es erst mit simuliertem Mausklick:
PostMessage (Button-Handle, WM_LBUTTONDOWN, 0,0);
// ev. Sleep (20);
PostMessage (Button-Handle, WM_LBUTTONUP, 0, 0);Falls das so nicht geht, kann man die Return-Taste auf den Button simulieren:
PostMessage (Button-Handle, WM_KEYDOWN, VK_RETURN, 0);
// ev. Sleep (20);
PostMessage (Button-Handle, WM_KEYUP, VK_RETURN, 0);Edit:
Habe gerade ausprobiert: OpenDialog->Handle liefert nicht das korrekte Handle des OpenDialogs.
Bei mir funktioniert folgendes:
HWND DialogHandle = FindWindow ("#32770", "Öffnen");
HWND Cancelbutton = FindWindowEx (DialogHandle, NULL, "Button", "Abbrechen");
PostMessage (Cancelbutton, WM_LBUTTONDOWN, 0,0);
PostMessage (Cancelbutton, WM_LBUTTONUP, 0, 0);
-
PostMessage(OpenDialog->Handle,WM_KEYDOWN,VK_ESCAPE,0);
PostMessage(OpenDialog->Handle,WM_KEYUP,VK_ESCAPE,0);sollte helfen.
Gruss
Frank
-
Hab nun Eure beiden Varianten ausprobiert. Leider ohne Erfolg.
Zum Verständnis: Muss es beim ersten FindWindow immer die #32770 sein, weil vielleicht Hauptfenster ?
Gibt's bei Windows 7 dazu irgendwelche Restriktionen ?
Kann's daran liegen, dass ich das Hauptfenster als MDIForm definiert habe ?
-
Bei mir funktioniert es mit dem C++ Builder 5 und CBuilder XE unter Windows XP.
Hast du eventuell gleichzeitig noch ein anderes Fenster mit "Öffnen" offen ?
Leider ist das ein Systemfenster und kein Unterfenster von was anderem.
Probiere doch mal mit dem Debugger, ob die Handles gefunden werden oder null sind.Edit: Unter Builder XE funktioniert es doch nicht,
dort funktioniert bei mir folgendes (ist aber nicht sehr elegant):HWND DialogHandle = FindWindow ("#32770", "Öffnen");
BringWindowToTop (DialogHandle);
keybd_event(VK_ESCAPE, 0, 0, 0);
keybd_event(VK_ESCAPE, 0, KEYEVENTF_KEYUP, 0);
-
Erst mal Danke für Eure/Deine Zeit und Hilfe.
Nein, es ist kein weiterer Dialog gleichen Namens geöffnet, und
Ja, für alle Handles scheinen gültige Werte zu existieren. Zumindest ist keiner undefiniert oder NULL.Ich werd' mal mit der vorgeschlagenen Lösung etwas weiter experimentieren, da ich diese so ähnlich auch schon im Netz gefunden habe, aber natürlich ebenso ohne das gewünschte Ergebnis im Programm.
Ansonsten freu' ich mich über weitere Ideen.
-
Hattest du das schon probiert, was ich im Edit geschrieben habe ?
HWND DialogHandle = FindWindow ("#32770", "Öffnen");
BringWindowToTop (DialogHandle);
keybd_event(VK_ESCAPE, 0, 0, 0);
keybd_event(VK_ESCAPE, 0, KEYEVENTF_KEYUP, 0);
-
Herrschaft !!
Das ist mir eben erst aufgefallen, dass Du ja den Code etwas modifiziert und das BringWindowToTop mit eingebaut hast. Das hab ich beim ersten Mal gar nicht gesehen.
Ich arbeite mit C++ Builder XE2 auf Windows 7(64bit).
Werde Deinen Vorschlag heute abend mal ausprobieren.
-
Altenburgers Variante mit dem richtigen Handle aus dem Ursprungspost.
HWND hwnd = GetParent(OpenDialog1->Handle); PostMessage(hwnd,WM_KEYDOWN,VK_ESCAPE,0); PostMessage(hwnd,WM_KEYUP,VK_ESCAPE,0);
-
Theoretisch so richtig, funktioniert aber bei mir unter Builder XE nicht.
Interessant, daß OpenDialog->Handle nicht das Handle des OpenDialog-Fensters zurückgibt, sondern das Handle eines namenlosen Unterfensters vom Typ Dialog, so daß GetParent dann das richtige Handle liefert.Bei mir funktioniert weiterhin nur folgendes:
HWND FensterHandle = GetParent (OpenDialog->Handle); BringWindowToTop (FensterHandle); // ev. Sleep (50); //damit das Fenster etwas Zeit bekommt, in den Vordergrund zu kommen keybd_event(VK_ESCAPE, 0, 0, 0); keybd_event(VK_ESCAPE, 0, KEYEVENTF_KEYUP, 0);
-
W. Posur schrieb:
Theoretisch so richtig, funktioniert aber bei mir unter Builder XE nicht.[/cpp]
Hatte ich vegessen: getestet mit XE2 auf W7-64.