28
Komunikaty w Komunikaty w Windows Windows Jarosław Kuchta Jarosław Kuchta

Komunikaty w Windows

  • Upload
    galya

  • View
    34

  • Download
    0

Embed Size (px)

DESCRIPTION

Jarosław Kuchta. Komunikaty w Windows. Okna i procedury okien. W Windows każde okno ma swoją procedurę sterującą. LRESULT CALLBACK WndProc ( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { … }. gdzie: hWnd jest uchwytem – identyfikatorem okna - PowerPoint PPT Presentation

Citation preview

Page 1: Komunikaty w Windows

Komunikaty w Komunikaty w WindowsWindows

Jarosław KuchtaJarosław Kuchta

Page 2: Komunikaty w Windows

Okna i procedury Okna i procedury okienokien

W Windows każde okno ma swoją procedurę sterującą.W Windows każde okno ma swoją procedurę sterującą.

LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

}

gdzie:gdzie: hWndhWnd jest uchwytem – identyfikatorem okna jest uchwytem – identyfikatorem okna messagemessage jest komunikatem kierowanym do okna jest komunikatem kierowanym do okna wParamwParam jest parametrem krótkim komunikatu jest parametrem krótkim komunikatu lParamlParam jest parametrem długim komunikatu jest parametrem długim komunikatu

Page 3: Komunikaty w Windows

KomunikatyKomunikaty

Komunikat jest poleceniem do wykonania Komunikat jest poleceniem do wykonania dla procedury oknadla procedury okna

Rodzaje komunikatów:Rodzaje komunikatów: komunikaty systemowe (generowane przez komunikaty systemowe (generowane przez

system w reakcji na zdarzenia pochodzące od system w reakcji na zdarzenia pochodzące od urządzeń)urządzeń)

komunikaty aplikacji (zdefiniowane w aplikacji komunikaty aplikacji (zdefiniowane w aplikacji i wysyłane od okna do okna).i wysyłane od okna do okna).

Page 4: Komunikaty w Windows

Komunikaty systemowe – Komunikaty systemowe – rozpoznawane przez rozpoznawane przez

przedrostekprzedrostek WM_ - duża grupa komunikatów ogólnychWM_ - duża grupa komunikatów ogólnych CCM_ - komunikaty uogólnione różnych CCM_ - komunikaty uogólnione różnych

kontrolekkontrolek EM_, EN_ - komunikaty pola edycjiEM_, EN_ - komunikaty pola edycji CDM_ - komunikaty dialogów (np. CDM_ - komunikaty dialogów (np.

otwarcia pliku)otwarcia pliku) ……

Page 5: Komunikaty w Windows

Komunikaty ogólneKomunikaty ogólne

komunikaty okienkomunikaty okien powiadomienia o zdarzeniach okienpowiadomienia o zdarzeniach okien powiadomienia o zdarzeniach klawiaturypowiadomienia o zdarzeniach klawiatury komunikaty klawiaturykomunikaty klawiatury powiadomienia o skrótach klawiaturowychpowiadomienia o skrótach klawiaturowych komunikaty skrótów klawiaturowych komunikaty skrótów klawiaturowych powiadomienia o zdarzeniach myszypowiadomienia o zdarzeniach myszy ……

Page 6: Komunikaty w Windows

Komunikaty okienKomunikaty okien WM_PAINT WM_PAINT – odrysowanie okna– odrysowanie okna WM_GETFONTWM_GETFONT – pobranie czcionki okna – pobranie czcionki okna WM_SETFONTWM_SETFONT – ustawienie czcionki okna – ustawienie czcionki okna WM_SETICONWM_SETICON – ustawienie ikony okna – ustawienie ikony okna WM_SETTEXTWM_SETTEXT – wpisanie tekstu do okna – wpisanie tekstu do okna

(kontrolka też jest oknem)(kontrolka też jest oknem) WM_GETTEXTLENGTHWM_GETTEXTLENGTH – pobranie długości – pobranie długości

tekstu wprowadzonego do oknatekstu wprowadzonego do okna WM_GETTEXTWM_GETTEXT – pobranie tekstu – pobranie tekstu

wprowadzonego do oknawprowadzonego do okna ……

Page 7: Komunikaty w Windows

Powiadomienia o Powiadomienia o zdarzeniach okienzdarzeniach okien

WM_CREATE WM_CREATE – okno zostało utworzone – okno zostało utworzone WM_ACTIVATE WM_ACTIVATE – okno zostało aktywowane– okno zostało aktywowane WM_ENABLEWM_ENABLE – okno dostało zezwolenie na – okno dostało zezwolenie na

przyjmowanie komunikatów od klawiatury i przyjmowanie komunikatów od klawiatury i myszymyszy

WM_SETFOCUSWM_SETFOCUS – okno będzie otrzymywać – okno będzie otrzymywać powiadomienia o zdarzeniach od klawiaturypowiadomienia o zdarzeniach od klawiatury

WM_KILLFOCUSWM_KILLFOCUS – okno przestaje otrzymywać – okno przestaje otrzymywać powiadomienia o zdarzeniach od klawiatury powiadomienia o zdarzeniach od klawiatury (tylko jedno okno dostaje (tylko jedno okno dostaje

WM_CLOSEWM_CLOSE – okno zostało zamknięte – okno zostało zamknięte WM_DESTROYWM_DESTROY – okno zostało zniszczone – okno zostało zniszczone ……

Page 8: Komunikaty w Windows

Powiadomienia o Powiadomienia o zdarzeniach klawiaturyzdarzeniach klawiatury

WM_KEYDOWNWM_KEYDOWN – klawisz został – klawisz został naciśniętynaciśnięty

WM_KEYUPWM_KEYUP – klawisz został zwolniony – klawisz został zwolniony WM_CHARWM_CHAR – przyszedł znak od – przyszedł znak od

klawiaturyklawiatury ……

Page 9: Komunikaty w Windows

Powiadomienia o Powiadomienia o zdarzeniach myszyzdarzeniach myszy

WM_LBUTTONDOWNWM_LBUTTONDOWN – lewy przycisk naciśnięty – lewy przycisk naciśnięty WM_LBUTTONUPWM_LBUTTONUP – lewy przycisk zwolniony – lewy przycisk zwolniony WM_LBUTTONDBLCLKWM_LBUTTONDBLCLK – lewy przycisk naciśnięty – lewy przycisk naciśnięty

dwukrotniedwukrotnie WM_MBUTTONDOWNWM_MBUTTONDOWN – środkowy przycisk naciśnięty – środkowy przycisk naciśnięty WM_MBUTTONUPWM_MBUTTONUP – środkowy przycisk zwolniony – środkowy przycisk zwolniony WM_MBUTTONDBLCLKWM_MBUTTONDBLCLK – środkowy przycisk naciśnięty – środkowy przycisk naciśnięty

dwukrotniedwukrotnie WM_RBUTTONDOWNWM_RBUTTONDOWN – prawy przycisk naciśnięty – prawy przycisk naciśnięty WM_RBUTTONUPWM_RBUTTONUP – prawy przycisk zwolniony – prawy przycisk zwolniony WM_RBUTTONDBLCLKWM_RBUTTONDBLCLK – prawy przycisk naciśnięty – prawy przycisk naciśnięty

dwukrotniedwukrotnie WM_MOUSEMOVEWM_MOUSEMOVE – mysz przesunięta – mysz przesunięta WM_MOUSEWHEELWM_MOUSEWHEEL – kółko myszy przekręcone – kółko myszy przekręcone

Page 10: Komunikaty w Windows

Przekazywanie Przekazywanie komunikatówkomunikatów

komunikaty niekolejkowanekomunikaty niekolejkowane komunikaty kolejkowanekomunikaty kolejkowane

Page 11: Komunikaty w Windows

Komunikaty Komunikaty niekolejkowaneniekolejkowane

Wymagają natychmiastowej reakcji okna, Wymagają natychmiastowej reakcji okna, np.:np.: WM_ACTIVATEWM_ACTIVATE WM_SETFOCUSWM_SETFOCUS WM_SETCURSORWM_SETCURSOR

Wysyłane przez funkcje:Wysyłane przez funkcje: SendMessageSendMessage SendMessageTimeoutSendMessageTimeout SendNotifyMessageSendNotifyMessage BroadcastSystemMessageBroadcastSystemMessage

Page 12: Komunikaty w Windows

Funkcja SendMessageFunkcja SendMessage

LRESULT WINAPI SendMessage(LRESULT WINAPI SendMessage( __in  HWND hWnd, __in  HWND hWnd, __in  UINT Msg, __in  UINT Msg, __in  WPARAM wParam, __in  WPARAM wParam, __in  LPARAM lParam ); __in  LPARAM lParam );

Wysyła komunikat do procedury okna i Wysyła komunikat do procedury okna i czeka na jego obsłużenie.czeka na jego obsłużenie.

Nie powraca, dopóki okno docelowe nie Nie powraca, dopóki okno docelowe nie zareaguje na komunikat.zareaguje na komunikat.

Page 13: Komunikaty w Windows

Funkcja Funkcja SendMessageTimeoutSendMessageTimeout

LRESULT WINAPI SendMessageTimeout(LRESULT WINAPI SendMessageTimeout( __in  HWND hWnd, __in  HWND hWnd, __in  UINT Msg, __in  UINT Msg, __in  WPARAM wParam, __in  WPARAM wParam, __in  LPARAM lParam, __in  LPARAM lParam, __in  UINT fuFlags, __in  UINT fuFlags, __in  UINT uTimeout, __in  UINT uTimeout, __out_opt  PDWORD_PTR lpdwResult ); __out_opt  PDWORD_PTR lpdwResult );

Wysyła komunikat do okna i czeka na jego Wysyła komunikat do okna i czeka na jego obsłużenie, ale tylko określony czas.obsłużenie, ale tylko określony czas.

Umożliwia przesłanie komunikatu do wszystkich Umożliwia przesłanie komunikatu do wszystkich okien najwyższego poziomu (głównych okien okien najwyższego poziomu (głównych okien programów).programów).

Page 14: Komunikaty w Windows

Funkcja Funkcja SendNotifyMessageSendNotifyMessage

LRESULT WINAPI SendNotifyMessage(LRESULT WINAPI SendNotifyMessage( __in  HWND hWnd, __in  HWND hWnd, __in  UINT Msg, __in  UINT Msg, __in  WPARAM wParam, __in  WPARAM wParam, __in  LPARAM lParam ); __in  LPARAM lParam );

Wysyła komunikat do okna i:Wysyła komunikat do okna i: jeśli okno należy do tego samego wątku, to jeśli okno należy do tego samego wątku, to

czeka na jego obsłużenie,czeka na jego obsłużenie, jeśli nie, to przekazuje komunikat do jeśli nie, to przekazuje komunikat do

procedury okna i wraca od razu.procedury okna i wraca od razu.

Page 15: Komunikaty w Windows

Funkcja Funkcja BroadcastSystemMessagBroadcastSystemMessag

ee long WINAPI BroadcastSystemMessage(long WINAPI BroadcastSystemMessage(

__in DWORD dwFlags, __in DWORD dwFlags, __inout_opt  LPDWORD lpdwRecipients, __inout_opt  LPDWORD lpdwRecipients, __in UINT uiMessage, __in UINT uiMessage, __in WPARAM wParam, __in WPARAM wParam, __in LPARAM lParam ); __in LPARAM lParam );

Wysyła komunikat do określonych Wysyła komunikat do określonych odbiorców:odbiorców: aplikacjiaplikacji instalowanych sterowników urządzeńinstalowanych sterowników urządzeń systemowych sterowników urządzeńsystemowych sterowników urządzeń sterowników sieciowychsterowników sieciowych

Page 16: Komunikaty w Windows

Funkcja SendMessageFunkcja SendMessage

LRESULT WINAPI SendMessage(LRESULT WINAPI SendMessage( __in  HWND hWnd, __in  HWND hWnd, __in  UINT Msg, __in  UINT Msg, __in  WPARAM wParam, __in  WPARAM wParam, __in  LPARAM lParam ); __in  LPARAM lParam );

Wysyła komunikat do okna i czeka na jego Wysyła komunikat do okna i czeka na jego obsłużenie.obsłużenie.

Nie powraca, dopóki okno docelowe nie Nie powraca, dopóki okno docelowe nie zareaguje na komunikat.zareaguje na komunikat.

Page 17: Komunikaty w Windows

Komunikaty Komunikaty kolejkowanekolejkowane

komunikaty od klawiaturykomunikaty od klawiatury komunikaty od myszykomunikaty od myszy inne, które nie muszą być obsłużone inne, które nie muszą być obsłużone

natychmiastnatychmiast umieszczane w kolejce komunikatówumieszczane w kolejce komunikatów

Page 18: Komunikaty w Windows

Kolejki komunikatówKolejki komunikatów

Pojedyncza kolejka systemowaPojedyncza kolejka systemowa Kolejki własne wątków GUIKolejki własne wątków GUI Inicjalnie każdy wątek jest tworzony bez Inicjalnie każdy wątek jest tworzony bez

kolejki komunikatówkolejki komunikatów Dla wątku, który wywołuje funkcje GUI, Dla wątku, który wywołuje funkcje GUI,

przy pierwszym wywołaniu tworzona jest przy pierwszym wywołaniu tworzona jest kolejka komunikatów.kolejka komunikatów.

Funkcje nie należące do GUI nie tworzą Funkcje nie należące do GUI nie tworzą kolejki komunikatów.kolejki komunikatów.

Page 19: Komunikaty w Windows

Wysyłanie komunikatów Wysyłanie komunikatów do kolejkido kolejki

Funkcje:Funkcje: PostMessagePostMessage PostThreadMessagePostThreadMessage

Komunikaty są umieszczane na końcu kolejki.Komunikaty są umieszczane na końcu kolejki. Komunikaty opuszczają kolejkę i są Komunikaty opuszczają kolejkę i są

przekazywane do procedury okna w kolejności przekazywane do procedury okna w kolejności ich umieszczania w kolejce z wyjątkiem:ich umieszczania w kolejce z wyjątkiem: WM_PAINTWM_PAINT WM_TIMERWM_TIMER WM_QUITWM_QUIT

które są zatrzymywane w kolejce do czasu, aż nie które są zatrzymywane w kolejce do czasu, aż nie ma w niej innych komunikatów i wtedy są ma w niej innych komunikatów i wtedy są przekazywane do procedury okna przekazywane do procedury okna

Page 20: Komunikaty w Windows

Funkcja PostMessageFunkcja PostMessage

LRESULT WINAPI PostMessage(LRESULT WINAPI PostMessage( __in  HWND hWnd, __in  HWND hWnd, __in  UINT Msg, __in  UINT Msg, __in  WPARAM wParam, __in  WPARAM wParam, __in  LPARAM lParam ); __in  LPARAM lParam );

Wysyła komunikat do kolejki wątku Wysyła komunikat do kolejki wątku skojarzonego z oknem i powraca skojarzonego z oknem i powraca natychmiastnatychmiast

Page 21: Komunikaty w Windows

Funkcja Funkcja PostThreadMessagePostThreadMessage

LRESULT WINAPI PostThreadMessage(LRESULT WINAPI PostThreadMessage( __in  DWORD idThread , __in  DWORD idThread , __in  UINT Msg, __in  UINT Msg, __in  WPARAM wParam, __in  WPARAM wParam, __in  LPARAM lParam ); __in  LPARAM lParam );

Wysyła komunikat do kolejki określonego Wysyła komunikat do kolejki określonego wątku i powraca natychmiastwątku i powraca natychmiast

Page 22: Komunikaty w Windows

Pętla obsługi Pętla obsługi komunikatówkomunikatów

Aplikacja pobiera w pętli komunikaty z kolejki, Aplikacja pobiera w pętli komunikaty z kolejki, tłumaczy je i kieruje do właściwej procedury okna.tłumaczy je i kieruje do właściwej procedury okna.

MSG msg; BOOL bRet; while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0) { if (bRet == -1) { // handle the error and possibly exit } else { TranslateMessage(&msg); DispatchMessage(&msg); } }

Page 23: Komunikaty w Windows

Funkcja GetMessageFunkcja GetMessage

BOOL WINAPI GetMessage(BOOL WINAPI GetMessage( __out LPMSG lpMsg, __out LPMSG lpMsg, __in_opt  HWND hWnd, __in_opt  HWND hWnd, __in UINT wMsgFilterMin, __in UINT wMsgFilterMin, __in UINT wMsgFilterMax ); __in UINT wMsgFilterMax );

Pobiera z kolejki komunikat kierowany do Pobiera z kolejki komunikat kierowany do określonego okna.określonego okna.

Umożliwia filtrowanie komunikatów.Umożliwia filtrowanie komunikatów. Wynik podaje w strukturze LPMSGWynik podaje w strukturze LPMSG

Page 24: Komunikaty w Windows

Funkcja Funkcja TranslateMessageTranslateMessage

BOOL WINAPI TranslateMessage(BOOL WINAPI TranslateMessage( __in  const MSG *lpMsg ); __in  const MSG *lpMsg );

Tłumaczy komunikaty klawiatury, np.: Tłumaczy komunikaty klawiatury, np.: WM_KEYDOWN i WM_KEYUP są WM_KEYDOWN i WM_KEYUP są tłumaczone na WM_CHAR (gdy to tłumaczone na WM_CHAR (gdy to możliwe)możliwe)

Page 25: Komunikaty w Windows

Funkcja Funkcja DispatchMessageDispatchMessage

LRESULT WINAPI DispatchMessage(LRESULT WINAPI DispatchMessage( __in  const MSG *lpmsg ); __in  const MSG *lpmsg );

Kieruje komunikat do właściwego okna Kieruje komunikat do właściwego okna określonego w strukturze MSGokreślonego w strukturze MSG

Page 26: Komunikaty w Windows

Obsługa komunikatówObsługa komunikatów

HWND hwndCombo; int cTxtLen; PSTR pszMem; switch (uMsg) { case WM_COMMAND: switch (LOWORD(wParam)) { case IDD_ADDCBITEM: // handle of the combo box message return TRUE; … } break; …}

Page 27: Komunikaty w Windows

Funkcja PeekMessageFunkcja PeekMessage BOOL WINAPI PeekMessage(BOOL WINAPI PeekMessage(

__out LPMSG lpMsg, __out LPMSG lpMsg, __in_opt  HWND hWnd, __in_opt  HWND hWnd, __in UINT wMsgFilterMin, __in UINT wMsgFilterMin, __in UINT wMsgFilterMax, __in UINT wMsgFilterMax, __in UINT wRemoveMsg ); __in UINT wRemoveMsg );

Przekazuje komunikaty wysłane metodą Send,Przekazuje komunikaty wysłane metodą Send, sprawdza, czy w kolejce są komunikatysprawdza, czy w kolejce są komunikaty i zwraca komunikat (gdy kolejka jest niepusta)i zwraca komunikat (gdy kolejka jest niepusta)

Page 28: Komunikaty w Windows

Sprawdzanie Sprawdzanie komunikatów w czasie komunikatów w czasie długotrwałych operacjidługotrwałych operacji

HWND hwnd; BOOL fDone; MSG msg; HWND hwnd; BOOL fDone; MSG msg; // Begin the operation and continue until it is complete // Begin the operation and continue until it is complete // or until the user clicks the mouse or presses a key. // or until the user clicks the mouse or presses a key. fDone = FALSE; fDone = FALSE; while (!fDone) while (!fDone) { { fDone = DoLengthyOperation(); // application-defined function fDone = DoLengthyOperation(); // application-defined function // Remove any messages that may be in the queue. If the // Remove any messages that may be in the queue. If the // queue contains any mouse or keyboard messages, end the operation. // queue contains any mouse or keyboard messages, end the operation. while (PeekMessage(&msg, hwnd, 0, 0, PM_REMOVE)) while (PeekMessage(&msg, hwnd, 0, 0, PM_REMOVE)) { { switch(msg.message) switch(msg.message) { case WM_LBUTTONDOWN: { case WM_LBUTTONDOWN: case WM_RBUTTONDOWN: case WM_RBUTTONDOWN: case WM_KEYDOWN: case WM_KEYDOWN: // Perform any required cleanup. // Perform any required cleanup. fDone = TRUE; fDone = TRUE; } } } } } }