verstaendnisfrage zu GetMessage



  • hola leute

    bei der WinApi programmierung sind mit einige dinge noch nicht so klar.
    GetMessage erwartet erwartet ja unter anderem als parameter einen HWND.
    den erhalte ich von CreateWindow(Ex).
    der ist dann fuer die gesammte lebzeit des fensters gueltig und wird auch beim systemaufrauf meinen WinProc uebergeben ?
    und wenn ich bei GetMessage fuer den HWND 0 eingebe, dann bekommt dieses GetMessage von allen existierenden fenstern die MSG und verteilt sie dann an die dazugehoerigen WndProcs der fenster wie sie in der WNDCLASS(EX) struktur angeben worden waren ?

    HINSTANCE welchen ich von der WinMain uebergeben bekomme, wird fuer jedes erzeugte fenster in der application hergenommen. auch fuer buttons usw ?

    Meep Meep



  • Hi

    Eigentlich hast du alles schon richtig gesagt. Jedes Fenster-Handle bleibt bis zu dessen Tod erhalten und wird auch an die entsprechende WinProc übergeben.
    Nur dass es (meines Wissens) nicht so ist, dass Windows die WndProc aufruft.
    Ferner hast du ja wahrscheinlich so eine Standard-Msg-Schleife:

    MSG Msg;
    while ( 1 )
    {
        BOOL Res = GetMessage( &Msg, NULL, 0, 0 );
        if ( Res==-1 || Res==0 )    // -1 bedeutet Fehler; 0 heißt, Nachricht enthält WM_QUIT
            break;
        TranslateMessage( &Msg );
        DispatchMessage( &Msg );
    }
    

    Die Funktion "GetMessage" holt die nächste Nachricht aus dem Nachrichten-Pott und überträgt sie in deine Variable "Msg".
    Die Funktion "TranslateMessage" prüft, ob sich aus bestimmten Nachrichten, z.B. WM_KEYDOWN/-UP benutzerfreundlichere Nachrichten erstellen lassen wie WM_CHAR. WM_CHAR wird, glaube ich, von Edit-Feldern benutzt.
    Und letztlich ruft deine Funktion "DispatchMessage" die zugehörige Fensterprozedur mit den entsprechenden Parametern (entnimmt sie der Msg-Variable) auf.

    Windows schickt deinem Fenster bzw. Thread nur die Nachricht.

    In der Regel ist es besser, wenn du bei "GetMessage" für das Fenster-Handle NULL angibst. Dann fängst du auch Nachrichten wie WM_QUIT ab 🙂

    Grüße,
    Badestrand



  • Badestrand schrieb:

    Nur dass es (meines Wissens) nicht so ist, dass Windows die WndProc aufruft.

    Doch genau das werden sie. ⚠ Deswegen heißen sie auch CALLBACK-Funktionen. 💡

    Nähere Informationen siehe ➡ <<Hier>> und <<Hier>> 😉 .



  • wie ist das eigendlich, wen man in einer application 2 top-level fenster hat ?
    wir da dann auch nur eine GetMessage schleife verwendet oder gibts dann zwei?
    so wie ich es jetzt verstanden habe kann es eigendlich pro thread nur eine GetMessage geben oder ?
    kann man dann ueberhaupt zwei top-level fenster in einem thread erstellen ? wenn ja, wie wuerde das von statten gehen ?

    die dispatch ist doch die funktion, die es veranlaesst, das vom system meine WndProc aufgerufen wird.
    vorausgesetzt, das das richtig ist koennte ich dann theoretisch meine WndProcs selber aufrufen? weil der hwnd wird mir ja geliefert.

    Meep Meep



  • Hi,

    Meep Meep schrieb:

    wie ist das eigendlich, wen man in einer application 2 top-level fenster hat ?
    wir da dann auch nur eine GetMessage schleife verwendet oder gibts dann zwei?

    Selbstverständlich nur eine.

    Meep Meep schrieb:

    so wie ich es jetzt verstanden habe kann es eigendlich pro thread nur eine GetMessage geben oder ?

    Pro Programm eine Nachrichten-Schleife, pro Thread würde wenig Sinn machen (-> CreateThread ?! 😉 ).

    Meep Meep schrieb:

    kann man dann ueberhaupt zwei top-level fenster in einem thread erstellen ? wenn ja, wie wuerde das von statten gehen ?

    'top-level fenster' ?! Meinst du als Extended-Style Flag WS_EX_TOPMOST ? ...
    Naja du rufst einfach n-Mal CreateWindow(Ex) auf...je nachdem ob du für jedes Fenster ne eigente WndProc
    einrichten willst (nicht zwingend aber sinnvoll wg Übersichtlichkeit) musst du jeweils ne neue Fensterklasse
    reggen.

    Meep Meep schrieb:

    die dispatch ist doch die funktion, die es veranlaesst, das vom system meine WndProc aufgerufen wird.
    vorausgesetzt

    Sieh dir das mal an...da wird das ganz gut erklärt (dt.)

    Meep Meep schrieb:

    das das richtig ist koennte ich dann theoretisch meine WndProcs selber aufrufen? weil der hwnd wird mir ja geliefert.

    Jo schon, aber mit welchem Hintergedanken/Grund/Ziel ?



  • re

    CodeFinder schrieb:

    Jo schon, aber mit welchem Hintergedanken/Grund/Ziel ?

    war nur eine reine interessensfrage. ich probier das system nur mal zu verstehen.

    Meep Meep schrieb:

    so wie ich es jetzt verstanden habe kann es eigendlich pro thread nur eine GetMessage geben oder ?

    Pro Programm eine Nachrichten-Schleife, pro Thread würde wenig Sinn machen (-> CreateThread ?! 😉 ).

    naja, aber ich koennte doch wenn ich lustig bin einen thread erzeugen und ein fenster mit ner eigenen GetMessage laufen lassen oder etwa nicht?
    wenn man ansich nur eine GetMessage-schleife pro application hat, was macht das dann fuer einen sinn, wenn man anstatt NULL einen hwnd angibt? dann bekommt man ja nur die MSGs von dem einen fenster und von sonst nichts. da wuerde man dann von den unterfenstern sprich buttons usw. keine benachrichtigung bekommen. oder irre ich mich da ?

    Meep Meep


  • Mod

    Ich würde eher von Message-Loops reden.
    Eigene Messageschleifen werden verwendet wenn zum Beispiel modale Dialoge benutzt werden. Auch wenn ein Menü aufgeklappt wird läuft intern eine eigene Messageschleife. Auch für Drag&Drop Vorgänge hat man manchmal eigene Messageschleifen entwickelt (ist aber sleten in den Beispielen geworden).

    Eine eigene Message-Loop macht immer dann Sinn, wenn man etwas entkoppeln will vom normalen Betrieb, wie eben einen modalen Dialog.
    Das diese natürlich alle auch WM_QUIT berücksichtigen sollten ist auch klar.


Anmelden zum Antworten