Funzione PostThreadMessageA (winuser.h)

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

Sintassi

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

Parametri

[in] idThread

Tipo: DWORD

Identificatore del thread in cui deve essere inviato il messaggio.

La funzione ha esito negativo se il thread specificato non ha una coda di messaggi. Il sistema crea la 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ò pubblicare messaggi solo in code di messaggi inviati di thread in processi di livello di integrità minore o uguale.

Questo thread deve avere il privilegio SE_TCB_NAME di pubblicare un messaggio a un thread appartenente 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 dispone di una coda di messaggi. GetLastError restituisce ERROR_NOT_ENOUGH_QUOTA quando viene raggiunto il limite di messaggi.

Commenti

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

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

  • Creare un oggetto evento, quindi creare il thread.
  • Usare la funzione WaitForSingleObject per attendere che l'evento venga impostato sullo stato segnalato prima di chiamare PostThreadMessage.
  • Nel thread in cui verrà inviato 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 inviati.
Il thread in cui viene inviato 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 non associati a una finestra non possono essere inviati dalla funzione DispatchMessage . Pertanto, se il thread del destinatario si trova in un ciclo modale (come usato da MessageBox o DialogBox), i messaggi andranno persi. Per intercettare i messaggi di thread in 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.

È previsto un limite di 10.000 messaggi inviati per ogni coda di messaggi. Questo limite deve essere sufficientemente grande. Se l'applicazione supera il limite, deve essere riprogettata per evitare di usare così 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 del preprocessore UNICODE. La combinazione dell'utilizzo dell'alias indipendente dalla codifica con il codice che non è indipendente dalla codifica può causare mancate corrispondenze che generano errori di compilazione o di runtime. Per altre informazioni, vedere Convenzioni per i prototipi di funzioni.

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