Funzione PostMessageA (winuser.h)
Places (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 pubblicazione di 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 Messaggi definiti dal sistema.
[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.
Commenti
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 o PeekMessage .
Le applicazioni che devono comunicare usando HWND_BROADCAST devono usare la funzione RegisterWindowMessage per ottenere un messaggio univoco per la comunicazione tra applicazioni.
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.
Se si invia un messaggio nell'intervallo seguente WM_USER alle funzioni di messaggio asincrone (PostMessage, SendNotifyMessage e SendMessageCallback), i parametri del messaggio non possono includere puntatori. altrimenti l'operazione non riesce. Le funzioni verranno restituite prima che il thread ricevente abbia avuto la possibilità di elaborare il messaggio e il mittente libera la memoria prima che venga usata.
Non pubblicare il messaggio WM_QUIT utilizzando PostMessage; usare la funzione PostQuitMessage .
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 ha esito negativo, chiamare GetLastError per ottenere informazioni estese sull'errore. GetLastError restituisce ERROR_NOT_ENOUGH_QUOTA quando viene raggiunto il limite.
Il valore minimo accettabile è 4000.
Esempio
Nell'esempio seguente viene illustrato come pubblicare un messaggio di finestra privata usando la funzione PostMessage . Si supponga di aver definito un messaggio di finestra privato denominato WM_COMPLETE:
#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 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
Requisito | Valore |
---|---|
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
Riferimento