none
Modales Fenster ermitteln und schliessen RRS feed

  • 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

    Donnerstag, 5. Mai 2011 15:33

Antworten

  • GetForegroundWindow nützt nichts.
    Weil das Prozess übergreifend funktioniert.

    GetActiveWindow sollte es eigentlich tun.
    Machst Du das auch aus dem gleichen Thread heraus?

    Was sagt GetLastActivePopup?


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Samstag, 7. Mai 2011 11:14
    Moderator

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
    Freitag, 6. Mai 2011 07:20
    Moderator
  • 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 darauf

    Gruss Joerg

    Freitag, 6. Mai 2011 15:06
  • GetForegroundWindow nützt nichts.
    Weil das Prozess übergreifend funktioniert.

    GetActiveWindow sollte es eigentlich tun.
    Machst Du das auch aus dem gleichen Thread heraus?

    Was sagt GetLastActivePopup?


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Samstag, 7. Mai 2011 11:14
    Moderator
  • 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 ?!

    Montag, 9. Mai 2011 09:50