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