Funzione PostThreadMessageW (winuser.h)

Invia un messaggio alla coda di messaggi del thread specificato. Restituisce senza attendere che il thread elabora il messaggio.

Sintassi

BOOL PostThreadMessageW(
  [in] DWORD  idThread,
  [in] UINT   Msg,
  [in] WPARAM wParam,
  [in] LPARAM lParam
);

Parametri

[in] idThread

Tipo: DWORD

Identificatore del thread a cui deve essere inviato il messaggio.

La funzione ha esito negativo se il thread specificato non ha una coda di messaggi. Il sistema crea una coda di messaggi di un thread quando il thread effettua la prima chiamata a una delle funzioni User o GDI. Per altre informazioni, vedere la sezione Osservazioni.

La registrazione dei messaggi è soggetta a UIPI. Il thread di un processo può inviare messaggi solo alle code di messaggi pubblicati dei thread nei processi di livello di integrità minore o uguale.

Questo thread deve avere il privilegio SE_TCB_NAME per pubblicare un messaggio a un thread che appartiene a un processo con lo stesso identificatore univoco locale (LUID), ma si trova in un desktop diverso. In caso contrario, la funzione ha esito negativo e restituisce ERROR_INVALID_THREAD_ID.

Questo thread deve appartenere allo stesso desktop del thread chiamante o a un processo con lo stesso LUID. In caso contrario, la funzione ha esito negativo e restituisce ERROR_INVALID_THREAD_ID.

[in] Msg

Tipo: UINT

Tipo di messaggio da pubblicare.

[in] wParam

Tipo: WPARAM

Ulteriori informazioni specifiche del messaggio.

[in] lParam

Tipo: LPARAM

Ulteriori informazioni specifiche del messaggio.

Valore restituito

Tipo: BOOL

Se la funzione ha esito positivo, il valore restituito è diverso da zero.

Se la funzione ha esito negativo, il valore restituito è zero. Per informazioni dettagliate sull'errore, chiamare GetLastError. GetLastError restituisce ERROR_INVALID_THREAD_ID se idThread non è un identificatore di thread valido o se il thread specificato da idThread non ha una coda di messaggi. GetLastError restituisce ERROR_NOT_ENOUGH_QUOTA quando viene raggiunto il limite di messaggio.

Commenti

Quando un messaggio viene bloccato dall'interfaccia utente l'ultimo errore, recuperato con GetLastError, è impostato su 5 (accesso negato).

Il thread a cui viene pubblicato il messaggio deve aver creato una coda di messaggi oppure la chiamata a PostThreadMessage ha esito negativo. Usare il metodo seguente per gestire questa situazione.

  • Creare un oggetto evento, quindi creare il thread.
  • Utilizzare la funzione WaitForSingleObject per attendere che l'evento venga impostato sullo stato segnalato prima di chiamare PostThreadMessage.
  • Nel thread a cui verrà pubblicato il messaggio, chiamare PeekMessage come illustrato qui per forzare il sistema a creare la coda dei messaggi.

    PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE)

  • Impostare l'evento per indicare che il thread è pronto per ricevere messaggi pubblicati.
Il thread a cui viene pubblicato il messaggio recupera il messaggio chiamando la funzione GetMessage o PeekMessage . Il membro hwnd della struttura MSG restituita è NULL.

I messaggi pubblicati da PostThreadMessage non sono associati a una finestra. Come regola generale, i messaggi che non sono associati a una finestra non possono essere inviati dalla funzione DispatchMessage . Pertanto, se il thread destinatario si trova in un ciclo modale (come usato da MessageBox o DialogBox), i messaggi verranno persi. Per intercettare i messaggi di thread durante un ciclo modale, usare un hook specifico del thread.

Il sistema esegue solo il marshalling per i messaggi di sistema (quelli inclusi nell'intervallo da 0 a (WM_USER-1)). Per inviare altri messaggi (quelli >= WM_USER) a un altro processo, è necessario eseguire il marshalling personalizzato.

Esiste un limite di 10.000 messaggi pubblicati per coda di messaggi. Questo limite deve essere sufficientemente grande. Se l'applicazione supera il limite, deve essere riprogettata per evitare l'utilizzo di tante risorse di sistema. Per modificare questo limite, modificare la chiave del Registro di sistema seguente.

HKEY_LOCAL_MACHINE
   SOFTWARE
      Microsoft
         Windows NT
            CurrentVersion
               Windows
                  USERPostMessageLimit

Il valore minimo accettabile è 4000.

Nota

L'intestazione winuser.h definisce PostThreadMessage come alias che seleziona automaticamente la versione ANSI o Unicode di questa funzione in base alla definizione della costante preprocessore UNICODE. La combinazione dell'utilizzo dell'alias di codifica neutrale con il codice che non è neutrale dalla codifica può causare errori di corrispondenza che causano errori di compilazione o runtime. Per altre informazioni, vedere Convenzioni per i prototipi di funzione.

Requisiti

   
Client minimo supportato Windows 2000 Professional [solo app desktop]
Server minimo supportato Windows 2000 Server [solo app desktop]
Piattaforma di destinazione Windows
Intestazione winuser.h (include Windows.h)
Libreria User32.lib
DLL User32.dll
Set di API ext-ms-win-ntuser-message-l1-1-0 (introdotto in Windows 8)

Vedi anche

Informazioni concettuali

GetCurrentThreadId

GetMessage

GetWindowThreadProcessId

MSG

Messaggi e code di messaggi

Altre risorse

PeekMessage

PostMessage

Riferimento

Sospendi

WaitForSingleObject