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.
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
Altre risorse
Riferimento