Programowanie w Środowisku Windows Mysz i klawiatura Programowanie w Środowisku Windows
Programowanie w Środowisku Windows Plan wykładu Focus okna Klawiatura Przyciśnięcie klawisza Generowanie znaków Obsługa myszy Programowanie w Środowisku Windows
Programowanie w Środowisku Windows Focus okna Adresat komunikatu Pole MSG::hwnd Okno aktywne ang. focus – adresat komunikatów Okna potomne – mogą mieć focus, ale aktywny jest rodzic Programowanie w Środowisku Windows
Programowanie w Środowisku Windows Focus okna Zmiana focusa Komunikaty WM_SETFOCUS WM_KILLFOCUS Przydzielanie focusa SetFocus() / GetFocus() W obrębie jednego wątku Programowanie w Środowisku Windows
Programowanie w Środowisku Windows Focus okna Aktywacja okna SetActiveWindow() / GetActiveWindow() WM_ACTIVATE Przydzielanie w obrębie jednego wątku Programowanie w Środowisku Windows
Programowanie w Środowisku Windows Focus okna Systemowa kolejka komunikatów Rozsyłanie komunikatów Po jednym Adresat – okno posiadające focus Możliwa zmiana focusa Komunikaty z myszy i klawiatury sa w systemowej kolejce i rozsylane po jednym do okna, ktore ma akurat focus. Obsluga komunikatu moze zmienic focus okna, dlatego okno nie otrzymuje wiecej niz jeden komunikat. Mozna pokazac przyklad z KEYDOWN / KEYUP (albo zasygnalizowac, ze pokaze sie pozniej) – jezeli sie debuguje, to dochodzi tylko komunikat DOWN – UP jest juz kierowany do VS Programowanie w Środowisku Windows
Programowanie w Środowisku Windows Klawiatura Komunikaty Naciśnięcie klawisza Generacja znaku Obsługa zależnie od zastosowania Programowanie w Środowisku Windows
Programowanie w Środowisku Windows Klawiatura Naciśnięcie klawisza WM_KEYDOWN / WM_SYSKEYDOWN WM_KEYUP / WM_SYSKEYUP Przytrzymanie klawisza – seria WM_KEYDOWN GetMessageTime() Klawisze systemowe Alt + function key, Tab, Esc Blokowanie Klawisze systemowe (Alt+...) mozna zablokowac poprzez wylaczenie obslugi komunikato SYS. Przyklad – Alt+F4. Niektore przechwytywane przez system, np Alt+Tab GetMessageTime – stempel czasowy komunikatu pobranego za pomoca GetMessage Programowanie w Środowisku Windows
Programowanie w Środowisku Windows Klawiatura Parametry komunikatów KEY wParam – kod VK_*** VK_MENU = Alt lParam Repeat Count Context Code Repeat Count > 1 – aplikacja nie nadaza z obsluga – mozna zignorowac, zeby nie kumulowac akcji Context Code: 1 dla systemowych (wyjatek – gdy okno jest aktywne, ale zminimalizowane, wtedy normalne przyciski przychodza jako SYS z flaga 0); 0 dla pozostalych (wyjatek – znaki regionalne, np. Alt+a) Przyklad: - ustawic prior na niski, poruszac myszka case WM_KEYDOWN: // while (GetAsyncKeyState (VK_F1) >= 0) ; if(LOWORD(lParam) > 1) { _stprintf(pszHitTestText, _T("Repeat: %d"), LOWORD(lParam)); MessageBox(hwnd, pszHitTestText, _T("a"), 0); } return 0; Programowanie w Środowisku Windows
Programowanie w Środowisku Windows Klawiatura Sprawdzenie stanu klawisza GetKeyState(VK_***) Klawisze dwustanowe (CapsLock) Uwaga: stan klawiatury w momencie otrzymania komunikatu Sprawdzanie asynchroniczne GetAsyncKeyState() GetKeyState – zwraca wart ujemna jak klawisz jest wcisniety (najstarszy bit ustawiony) lub dodatnia gdy przelaczony (najmlodszy bit ustawiony). Nie mozna zrobic czegos takiego: while (GetKeyState (VK_F1) >= 0) ; - program zawisnie. Async sprawdza stan przy kazdorazowym wywolaniu/ Programowanie w Środowisku Windows
Programowanie w Środowisku Windows Klawiatura Stosowanie KEYDOWN Strzałki, F1-F12 Insert, Delete, Shift, Ctrl, Alt Nie używać do znaków Wiązanie komunikatów Zapewnienie identycznej obsługi SendMessage() Wiązanie komunikatow – np. pomiedzy myszka i klawiatura Programowanie w Środowisku Windows
Programowanie w Środowisku Windows Klawiatura Komunikaty znaków WM_CHAR / WM_SYSCHAR WM_DEADCHAR / WM_SYSDEADCHAR lParam – tak samo jak przy KEY wParam – kod ANSI / UNICODE (TCHAR) RegisterClassA() i RegisterClassW() Unicode / Ansi – zaleznie od sposobu rejestarcji klasy Deadchar – znaki diakrytyczne, informacja powielona w komunikacie Char Programowanie w Środowisku Windows
Programowanie w Środowisku Windows Klawiatura Generacja komunikatu WM_CHAR TranslateMessage() Kolejność komunikatów: DOWN, CHAR, UP Obsługa znaków posiadających kod ASCII Zasada generacji komunikatow: KEYDOWN -> CHAR -> KEYUP Przyklad – usuniecie translate. Okno otrzymuje KEYUP tylko, gdy ma focus (postawic breakpoint na KEYDOWN – KEYUP nie dotrze, bo otrzyma go VS). --- Koniec wykladu Programowanie w Środowisku Windows
Programowanie w Środowisku Windows Klawiatura Karetka – opis i zasady Okno z focusem Tylko jedno okno w systemie Tworzenie i niszczenie Komunikaty SETFOCUS i KILLFOCUS Wyświetlanie i ukrywanie Karetka po utworzeniu jest niewidoczna Akcje wielokrotne są kumulowane Obsługa WM_PAINT Karetke nalezy ukryc podczas rysowania. Programowanie w Środowisku Windows
Programowanie w Środowisku Windows Klawiatura Funkcje obsługi karetki CreateCaret() Get / SetCaretPos() ShowCaret() HideCaret() DestroyCaret() Szybkość migania Get / SetCaretBlinkTime() Przyklad z czasem – oddzialuje na caly system Programowanie w Środowisku Windows
Programowanie w Środowisku Windows Klawiatura Klawisze specjalne Klawisze myszy Klawisze zasilania WM_APPCOMMAND wParam – uchwyt okna lParam – identyfikator DefWindowProc() – przekazuje rodzicowi lub do powłoki Jezeli okno nie jest oknem potomnym, to przekazuje do powloki Programowanie w Środowisku Windows
Programowanie w Środowisku Windows Mysz – komunikaty Położenie kursora – lParam GET_X_LPARAM, GET_Y_LPARAM Stan przycisków – wParam MK_LBUTTON, MK_SHIFT, MK_CONTROL GetKeyState() / GetAsyncKeyState() Akcje: Ruch Przyciski Kółko Programowanie w Środowisku Windows
Programowanie w Środowisku Windows Mysz – kliknięcia Kliknięcie w obszar roboczy WM_LBUTTONDOWN WM_LBUTTONUP WM_LBUTTONDBLCLK – zależnie od CS_DBLCLKS Kliknięcie poza obszarem roboczym WM_NC*** Współrzędne ekranu (lParam) Identyfikator fragmentu okna – HT*** (wParam) wParam Specifies the hit-test value returned by the DefWindowProc function as a result of processing the WM_NCHITTEST message. For a list of hit-test values, see WM_NCHITTEST. Programowanie w Środowisku Windows
Programowanie w Środowisku Windows Mysz – ruch WM_MOUSEMOVE Okno nie musi być aktywne Częstotliwość – przykład... WM_MOUSEWHEEL wParam GET_KEYSTATE_WPARAM GET_WHEEL_DELTA_WPARAM lParam – współrzędne Przykład Przyklad – rysowanie kropki przy kazdym mousemove GET_WHEEL_DELTA_WPARAM – zwraca przesuniecie w WHEEL_DELTA (=120) + do gory - na dol Programowanie w Środowisku Windows
Programowanie w Środowisku Windows Mysz – obsługa Przechwytywanie komunikatów myszy SetCapture(), ReleaseCapture() WM_CAPTURECHANGED Dwuklik Styl okna CS_DBLCLKS LBUTTONDBLCLK zamiast LBUTTONDOWN Zgodność akcji Uwazac z przechwytywaniem komunikatow – glownie stosowac do buttonUP Pierwszy klik powinien zawsze robic to samo Programowanie w Środowisku Windows
Mysz – testowanie położenia WM_NCHITTEST Poprzedza komunikaty myszy DefWindowProc() – identyfikator fragmentu okna HTCLIENT, HTNOWHERE, HTERROR Komunikaty obszaru roboczego dla HTCLIENT Wysyłany, gdy okno nie przechwytuje komunikatów The WM_NCHITTEST message is sent to a window when the cursor moves, or when a mouse button is pressed or released. If the mouse is not captured, the message is sent to the window beneath the cursor. Otherwise, the message is sent to the window that has captured the mouse. HTERROR – beep Mozna pokazac, ze nie jest wysylany w momencie, gdy przechwytywane sa komunikaty myszy z przycisnietym klawiszem myszy. Programowanie w Środowisku Windows
Programowanie w Środowisku Windows Mysz – śledzenie TrackMouseEvent() WM_MOUSEHOVER WM_MOUSELEAVE Struktura TRACKMOUSEEVENT Czas domyślny – 400ms Mozna sobie zarzadac wyslania komunikatu, jezeli mysz opusci / przebywa w oknie przez zadany czas Programowanie w Środowisku Windows
Programowanie w Środowisku Windows Mysz – sterowanie ShowCursor() Zliczanie wywołań – kumulacja Set / GetCursorPos() Emulacja myszy za pomocą klawiatury Programowanie w Środowisku Windows
Programowanie w Środowisku Windows Podsumowanie Komunikaty urządzeń zewnętrznych Przekazywane po jednym do okna z focusem Karetka – zasób systemowy Sprzężenie komunikatów klawiatury i myszy Programowanie w Środowisku Windows
Programowanie w Środowisku Windows Dziękuję za uwagę! Programowanie w Środowisku Windows