Upload
galya
View
34
Download
0
Tags:
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
Komunikaty w Komunikaty w WindowsWindows
Jarosław KuchtaJarosław Kuchta
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
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).
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) ……
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 ……
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 ……
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 ……
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 ……
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
Przekazywanie Przekazywanie komunikatówkomunikatów
komunikaty niekolejkowanekomunikaty niekolejkowane komunikaty kolejkowanekomunikaty kolejkowane
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
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.
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).
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.
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
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.
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
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.
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
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
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
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); } }
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
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)
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
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; …}
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)
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; } } } } } }