Pętla wiadomości

Pętla wiadomości proste składa się z jednym wywołaniu do każdego z tych trzech funkcji: GetMessage, TranslateMessagei DispatchMessage.

MSG msg;

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

Funkcja GetMessage Pobiera wiadomość z kolejki i kopiuje go do struktury typu MSG. Zwraca wartooć niezerową, chyba że napotka komunikat WM_QUIT , w tym przypadku zwraca wartość FALSE, a kończy pętli. W aplikacji jednowątkowych kończącym się pętla wiadomości jest często pierwszym krokiem w zamknięcie aplikacji. Aplikacja może zakończyć swoje własne pętlę za pomocą funkcji PostQuitMessage , zazwyczaj w odpowiedzi na komunikat WM_DESTROY w procedurze okna głównego okna aplikacji.

Jeśli określisz uchwyt okna jako drugi parametr GetMessagetylko wiadomości dla określonego okna są pobierane z kolejki. GetMessage można również filtrować wiadomości w kolejce, pobieranie tylko te wiadomości, które mieszczą się w określonym przedziale. Aby uzyskać więcej informacji na temat filtrowania wiadomości zobacz Filtrowanie wiadomości.

Pętla wiadomości wątku musi zawierać TranslateMessage , jeśli wątek jest dla danych wejściowych znaków z klawiatury. Wygenerowany przez system wiadomości klucza wirtualnego (WM_KEYDOWN i WM_KEYUP) przy każdym naciśnięciu klawisza. Komunikat klucza wirtualnego zawiera kod klucza wirtualnego, który identyfikuje, który klucz został naciśnięty, ale nie jego wartość znaku. Aby pobrać tę wartość, pętla wiadomości musi zawierać TranslateMessage, który tłumaczy wiadomości klucza wirtualnego wiadomość znaków (używając funkcji) i umieszcza go ponownie do kolejki wiadomości aplikacji. Komunikat znaków można następnie usunięte po kolejnych iteracji pętli komunikatów i wysyłane do procedury okna.

Funkcja DispatchMessage wysyła wiadomość do procedury okna związane z dojście do okna określona w strukturze MSG . Jeśli dojście do okna jest HWND_TOPMOST, DispatchMessage wysyła wiadomość do procedury okna wszystkich okien najwyższego poziomu w systemie. Jeśli dojście do okna ma wartość NULL, DispatchMessage does z komunikatem.

Główny wątek aplikacji rozpoczyna jego Pętla wiadomości po inicjowania aplikacji i tworzenie co najmniej jedno okno. Po rozpoczęciu, pętla wiadomości nadal pobierać wiadomości z kolejki wiadomości wątku i wysyłają je do odpowiedniego systemu windows. Pętla wiadomości kończy się, gdy funkcja GetMessage usuwa wiadomość WM_QUIT z kolejki wiadomości.

Pętla wiadomości tylko jeden jest potrzebny dla kolejki wiadomości, nawet jeżeli aplikacji zawiera wiele okien. DispatchMessage zawsze wysyła wiadomości, aby oknie właściwego; Każda wiadomość w kolejce jest struktura MSG , zawierający uchwyt okna, do której należy dany wiadomość.

Można zmodyfikować Pętla wiadomości na różne sposoby. Na przykład można pobrać wiadomości z kolejki, bez ich delegowania do okna. Jest to użyteczne w przypadku aplikacji, które ogłaszania wiadomości, nie określając okna. Można także bezpośrednie GetMessage do wyszukiwania określonych komunikatów, pozostawiając inne wiadomości w kolejce. Jest to przydatne, jeśli należy tymczasowo pominąć zwykłe porządku FIFO kolejki wiadomości.

Aplikacja, która używa klawisze przyśpieszające musi być w stanie tłumaczyć klawiatury wiadomości wiadomości polecenia. Aby to zrobić, pętla komunikatów aplikacji musi zawierać wywołania funkcji TranslateAccelerator . Aby uzyskać więcej informacji o klawiszach skrótu zobacz Skróty klawiaturowe.

Jeśli wątek używane okno dialogowe niemodalny, pętla wiadomości musi zawierać funkcji IsDialogMessage tak, aby oknie dialogowym można otrzymać klawiatury.

Index