Das gilt im Wesentlichen für In-Prozess-Anrufe. Prozessübergreifend SendMessage funktioniert ähnlich, aber die Verarbeitung der Nachricht beginnt nicht, bis der Empfängerprozess GetMessage (oder seine Verwandten) aufruft.
Ihr UI-Thread hat eine Nachricht Pumpe, die wie etwas aussieht:
while (GetMessage(&msg))
DispatchMessage(&msg);
Postmessage bewirkt, dass die Nachricht setzen auf die Nachrichtenwarteschlange werden. GetMessage entfernt die älteste Nachricht aus der Warteschlange (FIFO *).
DispatchMessage bewirkt, dass der mit dem Zielfenster der Nachricht verknüpfte WndProc mit der Nachricht aufgerufen wird.
SendMessage umgeht diese Kette im Grunde und ruft WndProc direkt (mehr oder weniger) auf.
Viele Standardfenstermeldungen führen zu einer Kette von SendMessage-Aufrufen, bei denen das Senden einer Nachricht eine andere sendet, die eine andere sendet. Diese Kette wird oft als "der aktuelle Versand" bezeichnet. Wenn Sie möchten, dass Ihre Nachricht innerhalb der Kette verarbeitet wird, verwenden Sie SendMessage. Wenn Sie nach Abschluss des aktuellen Versands eine Bearbeitung benötigen, verwenden Sie PostMessage.
Sie können ein Tool wie Spy++ verwenden, um Windows Messaging in Aktion zu sehen, oder um Probleme zu beheben, die Sie mit der Nachrichtenreihenfolge von Operationen haben.
[*] Es handelt sich nicht unbedingt um eine FIFO-Warteschlange, da bestimmte Arten von Nachrichten (d. H. Zeitgeber, Maus, Tastatur) nicht tatsächlich in die Warteschlange gestellt werden, sondern im laufenden Betrieb generiert werden. Der Einfachheit halber kann man es sich als FIFO vorstellen.