SendMessage (HWND_BROADCAST se bloque

Lorsque j’utilise la fonction SendMessage avec HWND_BROADCAST, l’application se bloque. il n’y a pas de réponse de l’application depuis longtemps.

Quelqu’un peut-il expliquer pourquoi?

Cela se produit lorsqu’un processus comporte une fenêtre de niveau supérieur, mais n’appelle pas GetMessage ou PeekMessage sur le thread qui a créé la fenêtre.

Pour assurer la compatibilité avec Windows 3.0, SendMessage ne sera pas renvoyé tant que toutes les fenêtres de niveau supérieur du système auront répondu à votre diffusion. Ce comportement était logique avant que Windows ne soit multithread, car SendMessage (), même lorsque l’envoi à d’autres processus ne bloquait jamais.

Mais à partir de Win32, lorsque vous envoyez un message à une fenêtre dans un autre processus, ce qui se passe réellement, c’est que votre thread se bloque jusqu’à ce que le thread de l’autre processus se réveille et gère le message. Si ce thread est occupé, ou ne génère pas de messages, vous attendez pour toujours.

Pour cette raison, vous devez toujours utiliser SendNotifyMessage ou SendMessageTimeout lorsque vous utilisez HWND_BROADCAST ou envoyez des messages aux fenêtres appartenant à d’autres processus.

En effet, SendMessage appelé avec HWND_BROADCAST énumère d’abord toutes les fenêtres disponibles, puis appelle SendMessage pour chacune de ces fenêtres. SendMessage ne retournera pas jusqu’à ce que la fenêtre ait fini de traiter le message. Si une seule fenêtre prend beaucoup de temps pour traiter le message, tout l’appel sera retardé.

Il y a un SendMessageTimeout qui limitera la durée de blocage de votre application en attendant que le récepteur l’accepte.

Une autre solution consiste à lancer plusieurs threads et à les envoyer en même temps (c’est-à-dire en parallèle). Ensuite, si l’un des récepteurs est bloqué, vous ne tuez pas l’intégralité de votre application.

Il y a au moins un processus qui a une pompe à message mais qui ne pompe pas les messages. SendMessage ne retourne pas tant que tous les destinataires n’ont pas traité le message … pour qu’il ne revienne pas. Vous pouvez essayer d’utiliser plutôt SendMessageTimeout pour contourner ce problème.

Incidemment, c’est pourquoi lancer un processus et attendre son traitement peut être source de problèmes. Je décris cela sur mon site ici .