Mehrere MessageBox-Dialoge auf einmal erstellen



  • Hi!

    Ich möchte, dass mehrere Windowsfenster auf einmal und NICHT HINTEREINANDER
    erstellt werden.

    #include <iostream>
    #include <windows.h>
    int main()
    {
    for(;;)
    {int Antwort=MessageBox(0,"TEXT","TEXT",MB_ICONASTERISK);}
    return 0;
    }
    

    Mit einem solchen Quellcode klappts leider nich, weil das aktuelle Fenster wahrscheinlich Blockiert ist oder so ähnlich..
    Die Fenster werden nur nach drücken von Ok des jeweiligen Fensters neu geladen, aber nicht zur gleichen Zeit.
    Kann man übrigens mit SetWindowPos() zufällige Positionen der Fenster einstellen?
    Wenn ja, wie?
    Danke im Voraus 😋 🙄



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Standard-C++ kennt keine Windowsfenster. Lies dir bitte den Link in meiner Signatur durch - und poste das nächstemal deine Fragen gleich im richtigen Forum. Danke.



  • Mach dich mal schlau mit dem Unterschied zwischen modalen und moduslosen Dialogen und wie diese in der Warteschleife der zugehörigen Windows-Prozedur zu handhaben sind. Und vergiss Messageboxes, die sind zwar einfach aber modal und müssen einzeln aufgerufen und geschlossen werden!



  • Ok danke


  • Mod

    Doch! Es geht relativ einfach.

    Einfach in einem Fenster einen Timer einbauen und in der Timer Routine MessageBox aufrufen. Wenn man es infinit macht nagelt man sich das ganze System zu...



  • berniebutt schrieb:

    Und vergiss Messageboxes, die sind zwar einfach aber modal und müssen einzeln aufgerufen und geschlossen werden!

    Das stimmt nicht. Man kann sowohl modal oder modeless MessageBox erstellen. Dies hängt allein davon ab, ob ein Handle zum owner window oder NULL als erster Parameter angegeben wurde.


  • Mod

    [Rewind] schrieb:

    Das stimmt nicht. Man kann sowohl modal oder modeless MessageBox erstellen. Dies hängt allein davon ab, ob ein Handle zum owner window oder NULL als erster Parameter angegeben wurde.

    Ich muss Dich korrigieren.
    MessageBox schließt immer eine MessageLoop ein. Damit ist die Funktionalität modal. D.h. erst wenn der User reagiert hat kommt die Funktion zurück.
    Alleine dadurch, dass nicht die eigene Message Loop läuft hätte die Funktion einer Anwendung schon Einschränkungen hinzunehmen.

    Welche Fenster disabled werden hängt entscheidend von den Flags ab die man mitgibt gerade auch wenn man MB_TASKMODAL verwendet!
    Siehe MSDN Doku...



  • Vielleicht ein unkonventioneller Weg: Unabhängigen Prozess schreiben, der nur eine über Commandline übergebenen Messagetext erhält. Aus der Hauptanwendung dann beliebige solcher Sekundärprozesse mit CreateProcess starten. Frisst aber auch Systemressourcen.



  • berniebutt schrieb:

    Vielleicht ein unkonventioneller Weg: Unabhängigen Prozess schreiben, der nur eine über Commandline übergebenen Messagetext erhält. Aus der Hauptanwendung dann beliebige solcher Sekundärprozesse mit CreateProcess starten. Frisst aber auch Systemressourcen.

    Diesen Lösungsansatz würde ich dann aber mit Threads in der Hauptanwendung realisieren, aber wie schon bereits vorher geschrieben: lieber einen modless Dialog selbern basteln.



  • Sorry Hacker, wenn die Diskussion jetzt ein wenig in eine andere Richtung geht, aber ich wollte nur wissen, was an meiner Aussage falsch war. Laut Wikipedia werden modale/moduslose Dialogfenster so definiert:

    Dialog boxes are classified as "modal" or "modeless", depending on whether or not they block interaction with the software that initiated the dialog.

    Und wenn man bei MessageBox ein parent window handle angibt, wird die Interaktion mit anderen Fenstern verhindert (ist dann laut Def. modal). Wenn man dies nicht tut, wird die Interaktion nicht verhindert (="moduslos").


  • Mod

    @[rewind]: Ja, die Deifnition ist richtig.
    Aber es hängt zusätzlich noch von dem Flag MB_TASKMODAL ab!

    Ich wollte auf die Gefahr hinweisen, dass in diesem Fall, eine andere Nachrichtenschleife läuft.
    Das würde bedeuten, dass z.B. ein Dialog nichtmehr korrekt funktioniert und Tabs nicht mehr erkannt werden, weil IsDialogMessage nicht mehr ausgeführt werden kann etc.



  • @Martin Richter @[rewind]

    Ich weiss nicht, so einfach scheint das mit einer modeless MessageBox nicht zu sein! Egal, ob mit einem hwndParent, NULL oder einem Flag MB_TASKMODAL bleibt die Standard-MessageBox bei mir stets modal und muss vom Anwender erst gechlossen werden bevor weitergearbeit werden kann. Das gewünschte Beibehalten und Umschalten einer oder mehrerer MessageBox mit dem aufrufenden Fenster bekomme ich nur mit einer eigenen MessageBoxOwn über CreateDialog, einer eigenen CALLBACK-Funktion für MessageBoxOwn und der expliziten Berücksichtigung als modeless Dialog mit IsDialogMessage in der Message-Loop hin. Für eine Standard-MessageBox bekomme ich nirgendwo eine Message mit (hwnd, msg, wParam, lParam) zu sehen und kann somit nichts anderes machen als das System vorgesehen hat.

    Die Frage ist durchaus interessant. Also habe ich nochmal geantwortet, obwohl ich noch keine allgemein brauchbare Lösung mit WinApi anbieten kann. In meinem Ansatz mit MessageBoxOwn fehlen derzeit einige Dinge, nämlich die bestimmbare Postionierung (wird alles an dieselbe Stelle gelagert) und die freie Übergabe der Titelzeile und der Texte.


  • Mod

    @berniebutt: MB_TASKMODAL darf in kenem Fall gesetzt sein. Lies doch bitte die Do0ku!

    Ansonsten hast Du sicherlich ein Problem weil die Messageloop der MessageBox Funktion läuft und nicht Deine. Aber da rede ich mir ja schon die ganze Zeit den Mund fusselig. Das kann zu allen mögich Effekten führen.

    Warum baust Du Dir nicht Deinen eigenen Dialog dazu?



  • @Martin Richter

    Du brauchst dir nicht den Mund fusselig zu reden! Die Standard-MessageBox von WinApi ist modal. Für modeless braucht man einen selbstgestrickten Dialog und die Berücksichtigung in der message loop. Kann man problemlos machen. Doch da gibt es auch den Gesichtspunkt der Übersichtlichkeit für den Anwender! Ich selbst wünsche kein Programm, das mir unübersichtlich viele MessageBoxes auf den Bildschirm knallt. Also wenn überhaupt, bitte die Anzahl beschränken auf vielleicht 3 solche MessageBoxes.

    Eine vorläufig brauchbare Lösung für modeless messageboxes findet sich auf meiner hp unter http://berniebutt.npage.de --> Programmierung --> download msgbox.txt
    Ist schnell zusammengestrickt und sicher verbesserbar!

    edit: @[rewind] Die modale Standard MessageBox eignet sich für konkrete Warnungen und Fehlermeldungen. Der Anwender soll auf die besonderen Situationen hingewiesen werden und nicht einfach weitermachen. Die hier diskutierte modeless MessageBox eignet sich dagegen für andere Textmitteilungen, etwa Hilfen oder ähnliches und kann dafür Sinn machen. Der Anwender kann weiterarbeiten und die modeless MessageBox beliebig auf dem Bildschirm verschieben oder schlicht schliessen. Kann jetzt Schluss sein mit diesem Thema? Es ist alles gesagt! Alles weitere liegt in der Verantwortung des Programmerstellers und gehört zum Thema 'anwenderfreundliches Programmdesign', doch danach war nicht gefragt.



  • @Hacker: Wozu brauchst du überhaupt so viele MessageBoxes? Wenn's normale modeless-Fenster wären (Suchfunktion, interaktive Datenverwaltung, etc.), würde ich das noch verstehen, aber MessageBox..? Wenn ich mich nicht irre, sind sie ja gerade dafür da, die Interaktion mit anderen Fenstern zu unterbrechen. Mir fällt auf die Schnelle kein Grund ein, warum man viele Warnungen auf einmal ausgeben lassen möchte..


Log in to reply