Funzione PostMessageA (winuser.h)
Inserisce (post) un messaggio nella coda di messaggi associata al thread che ha creato la finestra specificata e restituisce senza attendere che il thread elabori il messaggio.
Per pubblicare un messaggio nella coda di messaggi associata a un thread, usare la funzione PostThreadMessage.
Sintassi
BOOL PostMessageA(
[in, optional] HWND hWnd,
[in] UINT Msg,
[in] WPARAM wParam,
[in] LPARAM lParam
);
Parametri
[in, optional] hWnd
Tipo: HWND
Handle per la finestra la cui routine della finestra deve ricevere il messaggio. I valori seguenti hanno significati speciali.
Valore | Significato |
---|---|
|
Il messaggio viene inviato a tutte le finestre di primo livello del sistema, incluse finestre disabilitate o invisibili, finestre sovrapposte e finestre popup. Il messaggio non viene inviato alle finestre figlio. |
|
La funzione si comporta come una chiamata a PostThreadMessage con il parametro dwThreadId impostato sull'identificatore del thread corrente. |
A partire da Windows Vista, la registrazione dei messaggi è soggetta a UIPI. Il thread di un processo può pubblicare messaggi solo in code di messaggi di thread in processi di livello di integrità minore o uguale.
[in] Msg
Tipo: UINT
Messaggio da pubblicare.
Per gli elenchi dei messaggi forniti dal sistema, vedere System-Defined Messaggi.
[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.
Osservazioni
Quando un messaggio viene bloccato da UIPI l'ultimo errore, recuperato con GetLastError, è impostato su 5 (accesso negato).
I messaggi in una coda di messaggi vengono recuperati dalle chiamate alla funzione GetMessage
Le applicazioni che devono comunicare tramite
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.
Se si invia un messaggio nell'intervallo seguente WM_USER alle funzioni di messaggio asincrone (PostMessage, SendNotifyMessagee SendMessageCallback), i parametri del messaggio non possono includere puntatori. In caso contrario, l'operazione avrà esito negativo. Le funzioni verranno restituite prima che il thread di ricezione abbia avuto la possibilità di elaborare il messaggio e il mittente libera la memoria prima che venga usata.
Non pubblicare il messaggio di
Un'applicazione di accessibilità può usare PostMessage per pubblicare messaggi WM_APPCOMMAND nella shell per avviare le applicazioni. Questa funzionalità non è garantita per altri tipi di applicazioni.
Una coda di messaggi può contenere al massimo 10.000 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
Se la funzione non riesce, chiamare GetLastError per ottenere informazioni estese sull'errore. getLastError restituisce ERROR_NOT_ENOUGH_QUOTA quando viene raggiunto il limite.
Il valore minimo accettabile è 4000.
Esempi
Nell'esempio seguente viene illustrato come pubblicare un messaggio di finestra privata usando la funzione PostMessage
#define WM_COMPLETE (WM_USER + 0)
È possibile pubblicare un messaggio nella coda di messaggi associata al thread che ha creato la finestra specificata, come illustrato di seguito:
WaitForSingleObject (pparams->hEvent, INFINITE) ;
lTime = GetCurrentTime () ;
PostMessage (pparams->hwnd, WM_COMPLETE, 0, lTime);
Per altri esempi, vedere Avvio di un collegamento dati.
Nota
L'intestazione winuser.h definisce PostMessage 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
riferimento