Ciclo di messaggi

Un ciclo di messaggi semplice è costituito da una funzione chiamata a ciascuna di queste tre funzioni: GetMessage, TranslateMessagee DispatchMessage.

MSG msg;

mentre (GetMessage (amp; msg, NULL, 0, 0))
{
    TranslateMessage (& msg);
    DispatchMessage (& msg);
} 

La funzione GetMessage recupera un messaggio dalla coda e copiato in una struttura di tipo MSG. Esso restituisce un valore diverso da zero, a meno che non incontra il messaggio WM_QUIT , nel qual caso essa restituisce FALSE e termina il ciclo. In un'applicazione a thread singolo, che termina il ciclo di messaggi è spesso il primo passo per chiudere l'applicazione. Un'applicazione può terminare il proprio ciclo utilizzando la funzione PostQuitMessage, come descritto , in genere in risposta al messaggio WM_DESTROY nella routine della finestra principale dell'applicazione di finestra.

Se si specifica un handle di finestra come secondo parametro di GetMessage, solo i messaggi per la finestra specificata vengono recuperati dalla coda. GetMessage possibile filtrare i messaggi in coda, recuperando solo i messaggi che rientrano in un intervallo specificato. Per ulteriori informazioni sul filtraggio dei messaggi, vedere Filtraggio dei messaggi.

Ciclo di messaggi di un thread deve includere TranslateMessage se il thread è di ricevere il carattere l'input dalla tastiera. Il sistema genera messaggi di tasti virtuali (WM_KEYDOWN e WM_KEYUP) ogni volta che l'utente preme un tasto. Un messaggio chiave virtuale contiene un codice tasto virtuale che identifica quale tasto è stato premuto, ma non il valore del personaggio. Per recuperare questo valore, il ciclo di messaggi deve contenere TranslateMessage, che traduce il messaggio chiave virtuale in un messaggio di carattere (WM_CHAR) e lo inserisce nella coda di messaggi dell'applicazione. Il messaggio del carattere può essere rimosso su di una successiva iterazione del ciclo di messaggi e spedito a una routine della finestra.

La funzione DispatchMessage Invia un messaggio per la routine di finestra associata l'handle di finestra specificato nella struttura MSG . Se l'handle di finestra è HWND_TOPMOST, alle procedure di finestra di tutte le finestre di primo livello nel sistema DispatchMessage invia il messaggio. Se l'handle di finestra è NULL, DispatchMessage non fa nulla con il messaggio.

Thread principale di un'applicazione inizia il suo ciclo di messaggi dopo l'inizializzazione dell'applicazione e la creazione di almeno una finestra. Una volta avviato, il ciclo di messaggi continua per recuperare i messaggi dalla coda di messaggi del thread e inviarli a windows appropriato. Il ciclo di messaggi termina quando la funzione di GetMessage rimuove il messaggio WM_QUIT dalla coda dei messaggi.

Ciclo di un solo messaggi è necessario per una coda di messaggi, anche se un'applicazione contiene molte finestre. DispatchMessage sempre invia il messaggio alla finestra corretta; Questo è perché ciascun messaggio nella coda è una struttura MSG che contiene l'handle della finestra a cui appartiene il messaggio.

È possibile modificare un ciclo di messaggi in una varietà di modi. Ad esempio, è possibile recuperare i messaggi dalla coda senza li invio a una finestra. Questo è utile per le applicazioni che postare i messaggi non specificando una finestra. È inoltre possibile diretto GetMessage per cercare messaggi specifici, lasciando altri messaggi nella coda. Ciò risulta utile se si deve ignorare temporaneamente l'ordine FIFO usuale della coda di messaggi.

Un'applicazione che utilizza i tasti di scelta rapida deve essere in grado di tradurre i messaggi di tastiera in messaggi di comando. A tale scopo, il ciclo di messaggi dell'applicazione deve includere una chiamata alla funzione TranslateAccelerator . Per ulteriori informazioni sui tasti di scelta rapida, vedere Tasti di scelta rapida.

Se un thread utilizza una finestra di dialogo non modali, il ciclo di messaggi deve includere la funzione IsDialogMessage in modo che nella finestra di dialogo può ricevere l'input da tastiera.

Rimedio: Inserire il CD-ROM CD di MSDN Library.

Index