Benutzer mit den meisten Antworten
Modales Fenster ermitteln und schliessen

Frage
-
Hallo,
ich habe eine MDI MFC Applikation wo in einem CFormview durch eine Bedienerinteraktion ein modaler Dialog oder ein modales Propertysheet geoeffnet wurde. In meiner Anwendung tritt jetzt ein von aussen ausgelöstes Ereignis auf, das den modalen Dialog in jedem Fall schliessen soll falls er denn offen und sichtbar ist.
Wie erkenne ich das da ein modaler Dialog offen ist und wie kriege ich das Handle oder sonst einen Zeiger auf das modale Fenster um es dann per Sendmessage oder EndDialog zu schliessen ?
btw: der modale Dialog kann im einfachsten Fall auch eine AfxMessagebox sein die irgendwas anzeigt
Gruss Joerg
Antworten
-
- Als Antwort markiert Robert BreitenhoferModerator Montag, 30. Mai 2011 15:11
Alle Antworten
-
Einfach prüfen ob Deine Anwendung disabled ist.
Dann GetActiveWindow das Top-Level Fenster liefern. Wenn es MFC ist kannst Du einfach mit IsKindOf die Klasse ermitteln, die offen ist, oder du ermittelst die Klasse mit GetClassName.Mit einem einfachen PostMessage(WM_COMMAND,IDCANCEL) sollte sich das Fenster schließen lassen.
Da aber die Message-Loop involviert ist muss man evtl. den PostMessage durchführen, danach die Messages pumpen bis Idle, evtl. noch mal sehen ob weitere Dialoge offen sind.
Das setzt natürlich voraus, dass alle Dialoge sich durch einen Cancel abbrechen lassen.
Dir muss aber klar sein, dass wenn Du in dem Thread die Nachricht bekommst, dass Du schließen willst (auch via COM), dann erhältst Du die Nachricht im Kontext der Message-Loop des Dialoges, den Du Beenden willst. Also man sollte das Ganze evtl. aus einem anderen Thread kontrollieren oder steuern.
Ich erinnere mich auch an Tricks die man mit PostQuitMessage erreichen kann. Schau Dir mal an was Raymond Chan hier macht, Das kann auch für Dein Vorhaben "anwendbar" sein.
http://blogs.msdn.com/b/oldnewthing/archive/2005/03/04/385100.aspx
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de -
Hallo
sowas hatte ich auch schon gedacht, die Sache mit der Message-Loop ist mir eigentlich auch klar.
Ich bekomme aber mit GetActiveWindow nur einen Null Zeiger, auch GetForgroudnWindow liefert keine brauchbaren Ergebnisse
Das Ganze behandel ich im Mainframe und IsWindowEnabled von CMainframe liefert mir auch ordnungsgemaess die Info das das Mainframe
disabled ist so das ich auf jeden Fall schon mal weiss das da noch ein Modales Fenster offen sein muss, ich bekomme aber mit GetActiveWindow keinen Zeiger daraufGruss Joerg
-
- Als Antwort markiert Robert BreitenhoferModerator Montag, 30. Mai 2011 15:11
-
Hallo
JAAA, GetLastActivePopup ist die Zauberfunktion die zum Ziel führt, damit bekomme ich den gewünschten Zeiger auf die Modalen Dialoge oder Messageboxen, was ich allerdings nicht verstehe warum das mit GetActiveWindow nicht tut ?Ich behandele in CMainframe eine RegisteredWindowsMessage die von einer anderen Anwendung geschickt wird und mein Ereignis darstellt das zum Schliessen der modalen Dialoge führen soll. Die Modalen Dialog sind alle aus dem Mainthread gestartet worden, d.h. das Starten der modalen Dialoge, die Behandlung der RegisteredWindows Message, der Aufruf von GetActiveWindow etc erfolgt alles aus CMainframe oder darin verankerten Childviews heraus also alles definitiv der gleiche Thread.
Misteriös ?!