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 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ż

Linki zewnętrzne