Si MessageBox () / related es síncrono, ¿por qué mi ciclo de mensajes no se congela?

¿Por qué es que si llamo a una función de Windows aparentemente sincrónica comoMessageBox() dentro de mi bucle de mensajes, el bucle en sí no se congela como si hubiera llamadoSleep() (o una función similar) en su lugar? Para ilustrar mi punto, toma el siguiente esqueletoWndProc:

int counter = 0;

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
        case WM_CREATE:
             SetTimer(hwnd, 1, 1000, NULL); //start a 1 second timer
             break;
        case WM_PAINT:
             // paint/display counter variable onto window
             break;
        case WM_TIMER: //occurs every second
             counter++;
             InvalidateRect(hwnd, NULL, TRUE); //force window to repaint itself
             break; 
        case WM_LBUTTONDOWN: //someone clicks the window
             MessageBox(hwnd, "", "", 0);
             MessageBeep(MB_OK); //play a sound after MessageBox returns
             break;
        //default ....
    }
    return 0;
}

En el ejemplo anterior, la función principal del programa es ejecutar un temporizador y mostrar el valor del contador cada segundo. Sin embargo, si el usuario hace clic en nuestra ventana, el programa muestra un cuadro de mensaje y luego emite un pitido cuando se cierra el cuadro.

Aquí es donde se pone interesante: podemos decirMessageBox() Es una función síncrona porqueMessageBeep() no se ejecuta hasta que se cierre el cuadro de mensaje. Sin embargo, el temporizador sigue funcionando y la ventana se vuelve a pintar cada segundo incluso mientras se muestra el cuadro de mensaje. Entonces mientrasMessageBox() Aparentemente es una llamada de función de bloqueo, otros mensajes (WM_TIMER/WM_PAINT) todavía se puede procesar. Está bien, excepto si sustituyo a MessageBox por otra llamada de bloqueo comoSleep()

    case WM_LBUTTONDOWN:
         Sleep(10000); //wait 10 seconds
         MessageBeep(MB_OK);
         break;

Esto bloquea mi aplicación por completo, y no se procesa ningún mensaje durante los 10 segundos (WM_TIMER/WM_PAINT no se procesan, el contador no se actualiza, el programa se "congela", etc. Entonces, ¿por qué es eso?MessageBox() permite que el procesamiento de mensajes continúe mientrasSleep() no? Dado que mi aplicación es de un solo hilo, ¿qué es eso?MessageBox() ¿Para permitir esta funcionalidad? ¿El sistema 'replica' el hilo de mi aplicación, de modo que pueda terminar elWM_LBUTTONDOWN código una vezMessageBox() ¿Se hace, mientras se sigue permitiendo que el hilo original procese otros mensajes mientras tanto? (Esa fue mi suposición sin educación)

Gracias por adelantado

Respuestas a la pregunta(2)

Su respuesta a la pregunta