Ce qui se passe lorsque vous cliquez sur le bouton est qu'un message est posté dans la file d'attente des messages. Il n'est pas traité avant le prochain pompage de la file d'attente des messages. Ainsi, si vous constatez un délai entre le moment où vous cliquez sur le bouton et celui où le programme répond, c'est parce que la file d'attente des messages n'est pas servie en temps voulu.
Si le thread de l'interface graphique est occupé, la file d'attente des messages ne sera pas alimentée tant que le thread principal n'aura pas terminé ce qu'il est en train de faire. Et votre thread d'interface graphique sera occupé si vous avez des tâches de longue haleine. Une fois que le message de clic sur le bouton mis en file d'attente est finalement traité, l'appel à la commande MessageBoxW
aura pour effet d'afficher immédiatement la boîte de dialogue.
La seule autre raison pour laquelle le thread GUI ne s'exécuterait pas serait que le CPU soit consommé par des threads plus prioritaires. Mais c'est assez peu probable. Il est très rare que les applications utilisent des threads à haute priorité. Je serais surpris si vous le faisiez.
Comment résoudre le problème ? Si vous avez des tâches qui s'exécutent depuis longtemps sur votre thread principal, déplacez ces tâches sur des threads d'arrière-plan. Ou, si vous avez des threads à haute priorité qui empêchent le thread GUI de fonctionner, exécutez vos threads d'arrière-plan à priorité normale.