Messaggi in coda

Il sistema può visualizzare un numero qualsiasi di windows in un momento. Per indirizzare il mouse e la tastiera di input alla finestra appropriata, il sistema utilizza le code di messaggi.

il sistema mantiene una coda di messaggi del sistema unico e un numero qualsiasi di code di messaggi del thread, uno per ogni thread della GUI. Per evitare il sovraccarico di creazione di una coda di messaggi per i thread non GUI, tutti i thread vengono creati inizialmente senza una coda di messaggi. Il sistema crea la coda dei messaggi di un thread solo quando il thread effettua la prima chiamata a una delle funzioni utente Win32 o GDI.

Ogni volta che l'utente sposta il mouse, clicca i pulsanti del mouse o digita sulla tastiera, il driver di periferica per il mouse o tastiera converte l'input in messaggi e li inserisce nella coda dei messaggi di sistema. Il sistema consente di rimuovere i messaggi, uno alla volta, dalla coda dei messaggi di sistema, esamina li per determinare la finestra di destinazione e poi li messaggi alla coda di messaggi del thread che ha creato la finestra di destinazione. Coda dei messaggi di un thread riceve tutti i messaggi di mouse e tastiera per le finestre create dal thread. Il thread rimuove i messaggi dalla sua coda e dirige il sistema per inviare alla procedura appropriata finestra per elaborazione.

Con l'eccezione della messaggio WM_PAINT , il sistema invia sempre messaggi alla fine di una coda di messaggi. Ciò garantisce che una finestra riceve i messaggi di input nella sequenza corretta first-in First-Out (FIFO). Il messaggio WM_PAINT, tuttavia, viene mantenuto in coda e viene inoltrato routine di finestra solo quando la coda non contiene nessun altri messaggi. Più messaggi WM_PAINT per la stessa finestra vengono combinati in un singolo messaggio WM_PAINT, consolidare tutte le parti non valide dell'area client in una singola area. Combinando i messaggi WM_PAINT riduce il numero di volte in cui che una finestra deve ridisegnare il contenuto dell'area client.

Il sistema invia un messaggio alla coda dei messaggi di un thread da una struttura MSG di riempimento e quindi copiando la coda di messaggi. Informazioni in MSG includono: l'handle della finestra per cui il messaggio è destinato l'identificativo del messaggio, i due parametri del messaggio, il tempo è stato inviato il messaggio e la posizione del cursore del mouse. Un thread può inviare un messaggio alla coda di un altro thread o la propria coda di messaggi utilizzando la funzione PostMessage o PostThreadMessage.

Un'applicazione può rimuovere un messaggio dalla coda utilizzando la funzione GetMessage . Per esaminare un messaggio senza rimuoverlo dalla coda, un'applicazione può utilizzare la funzione PeekMessage . Questa funzione si riempie MSG di informazioni sul messaggio.

Dopo la rimozione di un messaggio dalla sua coda, un'applicazione può utilizzare la funzione DispatchMessage per dirigere il sistema per inviare il messaggio a una routine della finestra per elaborazione. DispatchMessage accetta un puntatore a MSG che è stato riempito da una precedente chiamata alla funzione GetMessage o PeekMessage . DispatchMessage passa l'handle di finestra, l'identificativo del messaggio e i parametri del messaggio due routine di finestra, ma non passare il tempo, che il messaggio è stato inviato o del mouse la posizione del cursore. Un'applicazione può recuperare queste informazioni chiamando le funzioni GetMessageTime e GetMessagePos durante l'elaborazione di un messaggio.

Un thread può utilizzare la funzione WaitMessage di cedere il controllo per altri thread quando non ha nessun messaggio nella coda dei messaggi. La funzione sospende il thread e non viene restituito finché un nuovo messaggio viene inserito nella coda di messaggi del thread.

È possibile chiamare la funzione SetMessageExtraInfo per associare un valore a 32 bit con coda di messaggi del thread corrente. Quindi chiamare la funzione GetMessageExtraInfo per ottenere il valore associato al messaggio ultimo estratto dalla funzione GetMessage o PeekMessage.

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

Index