Pętla komunikatów w systemie Microsoft Windows
Pętla komunikatów to obowiązkowa sekcja kodu w każdym programie korzystającym z graficznego interfejsu użytkownika w systemie Microsoft Windows . Programy systemu Windows z graficznym interfejsem użytkownika są sterowane zdarzeniami . System Windows utrzymuje indywidualną kolejkę komunikatów dla każdego wątku, który utworzył okno. Zwykle tylko pierwszy wątek tworzy okna. Windows umieszcza wiadomości do tej kolejki za każdym razem, gdy w oknie tego wątku wystąpi aktywność myszy, za każdym razem, gdy wystąpi aktywność klawiatury, gdy to okno jest aktywne, oraz w innych przypadkach. Proces może również dodawać komunikaty do własnej kolejki. Aby zaakceptować dane wprowadzane przez użytkownika iz innych powodów, każdy wątek z oknem musi stale pobierać komunikaty ze swojej kolejki i wykonywać na nich działania. Programista sprawia, że proces to robi, pisząc pętlę , która wywołuje GetMessage (która blokuje wiadomość i pobiera ją), a następnie wywołuje DispatchMessage (która wysyła wiadomość) i powtarza się w nieskończoność. To jest pętla wiadomości. programie głównym występuje pętla komunikatów , który działa w głównym wątku , oraz dodatkowa pętla komunikatów w każdym utworzonym modalnym oknie dialogowym . Komunikaty dla każdego okna procesu przechodzą przez jego kolejkę komunikatów i są obsługiwane przez jego pętlę komunikatów. Pętla komunikatów jest jednym z rodzajów pętli zdarzeń .
Podstawowa pętla komunikatów wygląda następująco:
0 0
0 int WINAPI WinMain ( HINSTANCE hInstance , HINSTANCE hPrevInstance , LPSTR lpCmdLine , int nCmdShow ) { MSG msg ; BOOL bRet ; while ( 1 ) { bRet = GetMessage ( & msg , NULL ,,, ) ; jeśli ( bRet > )
0
// (bRet > 0 oznacza wiadomość, która musi zostać przetworzona.) { TranslateMessage ( & msg ); Wysyłanie wiadomości ( & msg ); } else if ( bRet < ) // (bRet == -1 oznacza błąd.) { // Obsługa lub logowanie błędu; ewentualnie wyjść. // ... } else // (bRet == 0 wskazuje "program wyjścia".) { break ; } } wiadomość zwrotna .
wParam ; }
Pętla zdarzeń zwykle wywołuje TranslateMessage
przy każdej wiadomości, co może tłumaczyć naciśnięcia klawiszy wirtualnych na łańcuchy znaków . Wywołanie TranslateMessage
nie jest technicznie wymagane, ale jeśli nie zostanie wywołane, mogą wystąpić problemy. Pętla komunikatów musi wywoływać DispatchMessage
.
Pętla komunikatów nie oddziałuje bezpośrednio na komunikaty, które obsługuje. Wysyła je, wywołując funkcję DispatchMessage
, która przekazuje wiadomość do „procedury okna” dla okna, do którego wiadomość została zaadresowana. („Procedura okna” to wywołania zwrotnego , która została powiązana z klasą okna podczas jej rejestracji.) (Więcej niż jedno okno może używać tej samej procedury okna.)
Kod może również wysyłać komunikaty bezpośrednio do procedury okna. Są to tak zwane komunikaty niekolejkowane.
Ścisła pętla komunikatów nie jest jedyną opcją. Kod w innym miejscu programu może również akceptować i wysyłać komunikaty. PeekMessage
to nieblokujące połączenie, które powraca natychmiast, z komunikatem, jeśli ktoś oczekuje, lub bez komunikatu, jeśli nikt nie czeka. WaitMessage
umożliwia uśpienie wątku, dopóki wiadomość nie znajdzie się w kolejce.
Nowoczesne ramy interfejsów graficznych , takie jak Windows Forms , Windows Presentation Foundation , MFC , Delphi , Qt i inne, nie wymagają od aplikacji kodowania pętli komunikatów systemu Windows, ponieważ automatycznie kierują zdarzenia, takie jak naciśnięcia klawiszy i kliknięcia myszą, do odpowiednich procedur obsługi, takich jak zdefiniowane w ramach. Jednak każda struktura implementuje gdzieś pętlę komunikatów, a pętla komunikatów zwykle może być dostępna lub zastąpiona, gdy wymagana jest bardziej bezpośrednia kontrola.
Zobacz też
- Xlib dla pętli zdarzeń w systemie X Window
Linki zewnętrzne
- Meandering Through the Maze of MFC Message and Command Routing (MSJ, lipiec 1995)
- A Key's Odyssey: ścieżka wiadomości naciśnięcia klawisza przez VCL
- Zestaw SDK platformy: komunikaty i kolejki komunikatów
- Platform SDK: Interfejs API systemu Windows: wprowadzanie pętli komunikatów
- Korzystanie z wiadomości i kolejek wiadomości (MSDN)
- Funkcja GetMessage
- Funkcja PeekMessage