System automatycznie tworzy kolejkę wiadomości dla każdego wątku. Jeśli wątek tworzy jedno lub więcej okien, pętla wiadomości należy dostarczyć; ta pętla wiadomości pobiera wiadomości z kolejki wiadomości wątku i wysyła je do procedur odpowiedniego okna.
Ponieważ system kieruje wiadomości do poszczególnych okien aplikacji, wątek musi utworzyć co najmniej jedno okno przed rozpoczęciem jej Pętla wiadomości. Większość aplikacji opartych na Win32 zawierać pojedynczy wątek, który tworzy systemu windows. Typowa aplikacja rejestruje klasy okna dla jego główne okno, tworzy i pokazuje główne okno i następnie rozpoczyna jego Pętla wiadomości — wszystko w funkcji WinMain.
Pętla wiadomości należy utworzyć za pomocą funkcji GetMessage i DispatchMessage . Jeśli aplikacja musi uzyskać znak danych wejściowych od użytkownika, zawierają funkcję TranslateMessage w pętli. TranslateMessage tłumaczy klucza wirtualnego wiadomości na znak wiadomości. W poniższym przykładzie pokazano pętli komunikatów w funkcji WinMain prostych aplikacji systemu Win32.
Hinst wystąpienie HINSTANCE;
HWND hwndMain;
int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) {MSG msg;
WNDCLASS wc;
UNREFERENCED_PARAMETER(lpszCmdLine);
/ / Register klasy okna do głównego okna.
Jeżeli (! hPrevInstance) {wc.style = 0;
WC.lpfnWndProc = WndProc (WNDPROC);
WC.cbClsExtra = 0;
WC.cbWndExtra = 0;
WC.hInstance = wystąpienie hInstance;
WC.hIcon = LoadIcon((HINSTANCE) NULL, IDI_APPLICATION);
WC.hCursor = LoadCursor((HINSTANCE) NULL, IDC_ARROW);
WC.hbrBackground = GetStockObject(WHITE_BRUSH);
WC.lpszMenuName = "MainMenu";
WC.lpszClassName = "MainWndClass";
if (!.RegisterClass(amp;wc)) zwraca FALSE;
} hinst = wystąpienie hInstance; / / save uchwyt / / Create głównego okna.
hwndMain = CreateWindow ("MainWndClass", "Próbka", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT CW_USEDEFAULT, CW_USEDEFAULT, NULL (HWND), NULL (HMENU), hinst, NULL (elementem LPVOID));
/ / Jeżeli nie można utworzyć okna głównego, wypowiedzieć / / aplikacji.
Jeżeli (! hwndMain) return FALSE;
/ / Pokaż okno i malować zawartością.
ShowWindow (hwndMain, nCmdShow);
UpdateWindow(hwndMain);
/ / Start Pętla wiadomości.
podczas (GetMessage (& msg, (HWND) NULL, 0, 0)) {TranslateMessage(&msg);
DispatchMessage(&msg);
} / / Zwrócony kod wyjścia do systemu.
Zwraca msg.wParam;
}
Poniższy przykład ilustruje Pętla wiadomości dla wątku, który korzysta z akceleratorów i wyświetla okno dialogowe niemodalny. Gdy TranslateAccelerator lub IsDialogMessage zwraca wartość TRUE (wskazującą, że wiadomość została przetworzona), TranslateMessage i DispatchMessage nie noszą nazwę. Powodem tego jest, że TranslateAccelerator i IsDialogMessage wykonywać wszystkie niezbędne tłumaczenia i wysyłanie wiadomości.
HWND hwndMain;
HWND hwndDlgModeless = NULL;
MSG msg;
HACCEL haccel;
/ / / / Wykonać inicjowania i utworzyć główne okno.
/ / podczas (GetMessage (amp; msg, (HWND) NULL, 0, 0)) {Jeżeli (hwndDlgModeless == NULL (HWND) ||
!IsDialogMessage (hwndDlgModeless & msg) & &!TranslateAccelerator (hwndMain, haccel & msg)) {TranslateMessage(&msg);
DispatchMessage(&msg);
}
}