Kolejkowanie wiadomości

System może wyświetlać dowolną liczbę windows naraz. Aby rozesłać, myszy i klawiatury do odpowiedniego okna, system używa kolejki wiadomości.

system utrzymuje kolejka komunikatów jednolitego systemu i dowolną liczbę kolejek wiadomości wątku, jeden dla każdego wątku GUI. Aby uniknąć narzutów tworzenia kolejki wiadomości-GUI wątków, wszystkie wątki są tworzone początkowo bez kolejki wiadomości. System tworzy wątku wiadomości kolejki tylko wtedy, gdy wątek pozwala jej pierwsze wywołanie do jednej z funkcji użytkownika systemu Win32 lub GDI.

Ilekroć użytkownik przesunie wskaźnik myszy, kliknie przycisków myszy lub typy na klawiaturze, sterownik myszy lub klawiatury przekształca dane wejściowe w wiadomości i umieszcza je w systemowej kolejki wiadomości. System usuwa wiadomości, jeden po drugim, kolejki komunikatów systemu, bada możliwość określenia okno docelowe i następnie księguje je do kolejki wiadomości wątku, utworzony przez okno docelowe. Kolejka komunikatów dla wątku odbiera wszystkie wiadomości myszy i klawiatury dla systemu windows, tworzony przez wątek. Wątek usuwa wiadomości z kolejki i instruuje system, aby wysłać je do procedury odpowiedniego okna przetwarzania.

Z wyjątkiem WM_PAINT wiadomości, system zawsze zaksięguje wiadomości na końcu kolejki wiadomości. Gwarantuje to, że okno odbiera komunikaty wejściowe właściwego first-in, first-out (FIFO) sekwencji. Wiadomość WM_PAINT, jednak są przechowywane w kolejce i jest przekazywany do procedury okna tylko wtedy, gdy kolejka zawiera żadnych innych wiadomości. Wiele komunikaty WM_PAINT w tym samym oknie łączone są w jedną wiadomość WM_PAINT, konsolidacji wszystkie nieprawidłowe części obszaru klienckiego do pojedynczego obszaru. Łączenie komunikaty WM_PAINT zmniejsza liczbę razy okno musi odświeżyć zawartość swojego obszaru klienckiego.

System zaksięguje wiadomość do kolejki wiadomości wątku wypełnianie strukturę MSG , a następnie kopiując je do kolejki wiadomości. Zawiera informacje o błędzie : uchwyt okna, dla której wiadomość jest przeznaczone, identyfikator wiadomości, dwa parametry wiadomości, wiadomości został zaksięgowany czas i pozycji kursora myszy. Wątek można ogłosić wiadomość do kolejki wiadomości lub do kolejki inny wątek przy użyciu funkcji PostMessage lub PostThreadMessage.

Aplikację można usunąć wiadomości z kolejki przy użyciu funkcji GetMessage . Zbadanie wiadomość bez usuwania z kolejki, aplikacji można użyć funkcji PeekMessage . Funkcja ta wypełnia MSG informacje na temat komunikatu.

Po usunięciu wiadomości z kolejki, aplikacji można użyć funkcji DispatchMessage do kierowania system, aby wysłać wiadomość do procedury okna przetwarzania. DispatchMessage zajmuje wskaźnik MSG , która została wypełniona przez poprzednie wywołanie funkcji GetMessage lub PeekMessage . DispatchMessage przechodzi uchwyt okna, identyfikator wiadomości i dwa parametry wiadomości do procedury okna, ale nie przechodzą razem, gdy wiadomość została ogłoszona, ani nie pozycji kursora myszy. Aplikacja może pobrać tych informacji przez wywołanie funkcji GetMessageTime i GetMessagePos podczas przetwarzania wiadomości.

Wątek można użyć funkcji WaitMessage do wytworzenia kontroli innych wątków, gdy nie ma żadnych wiadomości z jej kolejki wiadomości. Funkcja wstrzymuje wątku i nie powróci do nowej wiadomości jest umieszczana w kolejce wiadomości dla wątku.

Można wywołać funkcję SetMessageExtraInfo , aby skojarzyć 32-bitowymi wartościami z bieżącego wątku wiadomości kolejki. Następnie wywołać funkcję GetMessageExtraInfo , aby uzyskać wartość skojarzona z ostatniej wiadomości pobrane przez funkcję GetMessage lub PeekMessage.

Index