Fonction PostThreadMessageW (winuser.h)
Publie un message dans la file d’attente de messages du thread spécifié. Il retourne sans attendre que le thread traite le message.
Syntaxe
BOOL PostThreadMessageW(
[in] DWORD idThread,
[in] UINT Msg,
[in] WPARAM wParam,
[in] LPARAM lParam
);
Paramètres
[in] idThread
Type : DWORD
Identificateur du thread sur lequel le message doit être publié.
La fonction échoue si le thread spécifié n’a pas de file d’attente de messages. Le système crée la file d’attente de messages d’un thread lorsque le thread effectue son premier appel à l’une des fonctions User ou GDI. Pour plus d'informations, consultez la section Notes.
La publication de messages est soumise à l’UIPI. Le thread d’un processus peut publier des messages uniquement dans des files d’attente de messages publiés de threads dans des processus de niveau d’intégrité inférieur ou égal.
Ce thread doit avoir le privilège SE_TCB_NAME pour publier un message sur un thread qui appartient à un processus avec le même identificateur unique local (LUID), mais qui se trouve sur un autre bureau. Sinon, la fonction échoue et retourne ERROR_INVALID_THREAD_ID.
Ce thread doit appartenir au même bureau que le thread appelant ou à un processus avec le même LUID. Sinon, la fonction échoue et retourne ERROR_INVALID_THREAD_ID.
[in] Msg
Type : UINT
Type de message à publier.
[in] wParam
Type : WPARAM
Informations supplémentaires spécifiques au message.
[in] lParam
Type : LPARAM
Informations supplémentaires spécifiques au message.
Valeur renvoyée
Type : BOOL
Si la fonction réussit, la valeur de retour est différente de zéro.
Si la fonction échoue, la valeur de retour est égale à zéro. Pour obtenir des informations détaillées sur l’erreur, appelez GetLastError. GetLastError retourne ERROR_INVALID_THREAD_ID si idThread n’est pas un identificateur de thread valide ou si le thread spécifié par idThread n’a pas de file d’attente de messages. GetLastError retourne ERROR_NOT_ENOUGH_QUOTA lorsque la limite de message est atteinte.
Remarques
Lorsqu’un message est bloqué par UIPI, la dernière erreur, récupérée avec GetLastError, est définie sur 5 (accès refusé).
Le thread sur lequel le message est publié doit avoir créé une file d’attente de messages, sinon l’appel à PostThreadMessage échoue. Utilisez la méthode suivante pour gérer cette situation.
- Créez un objet d’événement, puis créez le thread.
- Utilisez la fonction WaitForSingleObject pour attendre que l’événement soit défini sur l’état signalé avant d’appeler PostThreadMessage.
-
Dans le thread dans lequel le message sera publié, appelez PeekMessage comme illustré ici pour forcer le système à créer la file d’attente des messages.
PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE)
- Définissez l’événement pour indiquer que le thread est prêt à recevoir des messages publiés.
Les messages publiés par PostThreadMessage ne sont pas associés à une fenêtre. En règle générale, les messages qui ne sont pas associés à une fenêtre ne peuvent pas être distribués par la fonction DispatchMessage . Par conséquent, si le thread destinataire se trouve dans une boucle modale (comme utilisé par MessageBox ou DialogBox), les messages seront perdus. Pour intercepter des messages de thread dans une boucle modale, utilisez un hook spécifique au thread.
Le système effectue uniquement le marshaling pour les messages système (ceux de la plage 0 à (WM_USER-1)). Pour envoyer d’autres messages (ceux >= WM_USER) à un autre processus, vous devez effectuer un marshaling personnalisé.
Il existe une limite de 10 000 messages publiés par file d’attente de messages. Cette limite doit être suffisamment importante. Si votre application dépasse la limite, elle doit être repensée pour éviter de consommer autant de ressources système. Pour ajuster cette limite, modifiez la clé de Registre suivante.
HKEY_LOCAL_MACHINE SOFTWARE Microsoft Windows NT CurrentVersion Windows USERPostMessageLimit
La valeur minimale acceptable est 4000.
Notes
L’en-tête winuser.h définit PostThreadMessage comme un alias qui sélectionne automatiquement la version ANSI ou Unicode de cette fonction en fonction de la définition de la constante de préprocesseur UNICODE. Le mélange de l’utilisation de l’alias neutre en encodage avec du code qui n’est pas neutre en encodage peut entraîner des incompatibilités qui entraînent des erreurs de compilation ou d’exécution. Pour plus d’informations, consultez Conventions pour les prototypes de fonction.
Configuration requise
Client minimal pris en charge | Windows 2000 Professionnel [applications de bureau uniquement] |
Serveur minimal pris en charge | Windows 2000 Server [applications de bureau uniquement] |
Plateforme cible | Windows |
En-tête | winuser.h (inclure Windows.h) |
Bibliothèque | User32.lib |
DLL | User32.dll |
Ensemble d’API | ext-ms-win-ntuser-message-l1-1-0 (introduit dans Windows 8) |
Voir aussi
Conceptuel
Messages et files d’attente de messages
Autres ressources
Référence