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 dispone di 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 per 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
Informazioni aggiuntive specifiche del messaggio.
[in] lParam
Tipo: LPARAM
Informazioni aggiuntive 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 ottenere informazioni estese 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.
Osservazioni
Quando un messaggio viene bloccato da UIPI l'ultimo errore, recuperato con GetLastError, è impostato su 5 (accesso negato).
Il thread a 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.
-
Utilizzare la funzione WaitForSingleObject
per attendere che l'evento venga impostato sullo stato segnalato prima di chiamare PostThreadMessage . -
Nel thread in cui verrà pubblicato il messaggio chiamare PeekMessage come illustrato di seguito 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
Il sistema esegue solo il marshalling per i messaggi di sistema (quelli compresi 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 non indipendente dalla codifica può causare mancate corrispondenze che generano errori di compilazione o di runtime. Per altre informazioni, vedere convenzioni di per i prototipi di funzioni.
Fabbisogno
Requisito | Valore |
---|---|
client minimo supportato | Windows 2000 Professional [solo app desktop] |
server minimo supportato | Windows 2000 Server [solo app desktop] |
piattaforma di destinazione | Finestre |
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) |
Vedere anche
concettuale
altre risorse
riferimento