Condividi tramite


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
HWND_BROADCAST
((HWND)0xffff)
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.
NULLO
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 o PeekMessage.

Le applicazioni che devono comunicare tramite 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 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 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 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 . 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 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

GetMessage

messaggi e code di messaggi

PeekMessage

PostQuitMessage

PostThreadMessage

riferimento

RegisterWindowMessage

SendMessageCallback

SendNotifyMessage