C
Mit einem Wort: Windows.
<hypothese>
Wenn man den Code im Debugger durchgeht, sieht man, dass natürlich zuerst WM_KEYDOWN kommt.
Der MessageBox-Aufruf ist zwar blockend, die Nachrichten des Hauptfensters werden aber trotzdem weiter verarbeitet. Erkennen kann man das z.B. daran, dass das Fenster immer noch neu gezeichnet wird, wenn man die MessageBox verschiebt.
Ich vermute nun, dass die Nachrichtenwarteschlange des Hauptfensters geleert wird, bevor die MessageBox angezeigt wird. Dadurch kommt TranslateMessage zum Zug und postet ein WM_CHAR. Dieses wird sofort verarbeitet und eine weitere MessageBox soll angezeigt werden. Dieser Aufruf kam zwar nach der WM_KEYDOWN-MessageBox, aber das ist der neuen MessageBox egal. Sie stellt fest, dass die Nachrichtenschleife nach dem WM_CHAR leer ist und zeigt die Meldung an.
Jetzt kann die erste MessageBox natürlich nichts anzeigen, da es ja keine Multithread-Anwendung ist. Die Nachrichtenschleife der ersten MessageBox hängt quasi bei der Funktion VerarbeiteHauptfensterNachrichten(). Wenn die zweite Box geschlossen wird, kommt die erste zum Zuge und kann mit ihrer Nachrichtenschleife fortfahren.
</hypothese>