Jak działa wprowadzanie klawiatury
Windows Forms przetwarza dane wejściowe z klawiatury poprzez wywoływanie zdarzeń klawiatury w odpowiedzi na komunikaty systemu Windows. Większość aplikacji Windows Forms przetwarza dane wejściowe klawiatury wyłącznie przez obsługę zdarzeń klawiatury. Należy jednak zrozumieć, jak działają komunikaty klawiaturowe, aby można było zaimplementować bardziej zaawansowane scenariusze wprowadzania klawiatury, takie jak przechwytywanie klawiszy, zanim dotrą do kontrolki. W tym temacie opisano typy kluczowych danych rozpoznawanych przez formularze systemu Windows oraz omówiono sposób kierowania komunikatów klawiaturowych. Aby uzyskać informacje o zdarzeniach klawiatury, zobacz Using Keyboard Events.
Typy kluczy
Formularze systemu Windows identyfikują dane wejściowe klawiatury jako kody klawiszy wirtualnych, które są reprezentowane przez wyliczenie bitowe Keys. Wyliczenie Keys umożliwia połączenie serii naciśniętych klawiszy, co skutkuje powstaniem pojedynczej wartości. Te wartości odpowiadają wartościom towarzyszącym komunikatom WM_KEYDOWN i WM_SYSKEYDOWN systemu Windows. Większość naciśnięcia fizycznych można wykryć, obsługując zdarzenia KeyDown lub KeyUp. Klucze znaków są podzbiorem wyliczenia Keys i odpowiadają wartościom towarzyszącym komunikatom WM_CHAR i WM_SYSCHAR Windows. Jeśli kombinacja naciśniętych klawiszy powoduje znak, można wykryć ten znak, obsługując zdarzenie KeyPress. Alternatywnie można użyć Keyboard, udostępnionej przez interfejs programowania języka Visual Basic, aby sprawdzić, które klawisze zostały naciśnięte i wysłać klawisze. Aby uzyskać więcej informacji, zobacz Uzyskiwanie dostępu doklawiatury .
Kolejność zdarzeń klawiatury
Jak wspomniano wcześniej, istnieją 3 zdarzenia związane z klawiaturą, które mogą wystąpić w kontrolce. Poniższa sekwencja przedstawia ogólną kolejność zdarzeń:
Użytkownik naciska klawisz "a", klawisz jest wstępnie przetwarzany, przesyłany i występuje zdarzenie KeyDown.
Użytkownik przechowuje klucz "a", klucz jest wstępnie przetworzony, wysłany i występuje zdarzenie KeyPress.
To zdarzenie występuje wiele razy, gdy użytkownik przechowuje klucz.
Użytkownik zwalnia klucz "a", klucz jest wstępnie przetworzony, wysłany i wystąpi zdarzenie KeyUp.
Klucze przetwarzania wstępnego
Podobnie jak inne komunikaty, komunikaty klawiaturowe są przetwarzane w metodzie WndProc formularza lub kontrolki. Jednak przed przetworzeniem komunikatów klawiaturowych metoda PreProcessMessage wywołuje jedną lub więcej metod, które można zastąpić do obsługi znaków specjalnych i kluczy fizycznych. Te metody można zastąpić w celu wykrywania i filtrowania niektórych kluczy przed przetworzeniem komunikatów przez kontrolkę. W poniższej tabeli przedstawiono wykonywaną akcję i powiązaną metodę w kolejności, w jaką występuje metoda.
Wstępne przetwarzanie dla zdarzenia KeyDown
Akcja | Powiązana metoda | Notatki |
---|---|---|
Sprawdź klucz polecenia, taki jak skrót akceleratora lub menu. | ProcessCmdKey | Ta metoda przetwarza klucz polecenia, który ma pierwszeństwo przed zwykłymi kluczami. Jeśli ta metoda zwraca true , komunikat klucza nie zostanie wysłany i nie wystąpi zdarzenie klucza. Jeśli zwraca false , wywoływana jest IsInputKey jako. |
Sprawdź specjalny klawisz, który wymaga wstępnego przetwarzania, lub klawisz z normalnym znakiem, który powinien wywołać zdarzenie KeyDown i zostać przekazany do kontrolki. | IsInputKey | Jeśli metoda zwróci true , oznacza to, że kontrolka jest zwykłym znakiem i zostanie zgłoszone zdarzenie KeyDown. Jeśli false , ProcessDialogKey jest wywoływane.
Uwaga: Aby zapewnić, że kontrolka otrzyma klucz lub kombinację kluczy, możesz obsłużyć zdarzenie PreviewKeyDown i ustawić IsInputKey w PreviewKeyDownEventArgs na true dla wybranego klucza lub kluczy. |
Sprawdź klucz nawigacji (ESC, TAB, Return lub klawisze strzałek). | ProcessDialogKey | Ta metoda przetwarza fizyczny klawisz, który wykorzystuje specjalne funkcjonalności w kontrolce, takie jak przełączanie fokusu między kontrolką a jej elementem nadrzędnym. Jeśli kontrolka bezpośrednia nie obsługuje klucza, ProcessDialogKey jest wywoływana w kontroli nadrzędnej i tak dalej do najwyższej kontrolki w hierarchii. Jeśli ta metoda zwraca true , przetwarzanie wstępne zostanie ukończone i nie zostanie wygenerowane zdarzenie klucza. Jeśli zostanie zwrócone false , zdarzy się zdarzenie KeyDown. |
Wstępne przetwarzanie dla zdarzenia KeyPress
Akcja | Powiązana metoda | Notatki |
---|---|---|
Sprawdź, czy klucz jest normalnym znakiem, który powinien zostać przetworzony przez kontrolkę | IsInputChar | Jeśli znak jest normalnym znakiem, ta metoda zwraca true , zdarzenie KeyPress jest wywoływane i nie ma dalszego przetwarzania wstępnego. W przeciwnym razie zostanie wywołana ProcessDialogChar. |
Sprawdź, czy znak jest mnemoniczny (na przykład &OK na guziku) | ProcessDialogChar | Ta metoda, podobna do ProcessDialogKey, będzie wywołana w hierarchii sterowania. Jeśli kontrolka jest kontrolką kontenera, sprawdza ona mnemotechniki, wywołując ProcessMnemonic na sobie i jej kontrolkach podrzędnych. Jeśli ProcessDialogChar zwróci true , zdarzenie KeyPress nie wystąpi. |
Przetwarzanie komunikatów klawiaturowych
Po dotarciu komunikatów klawiaturowych do metody WndProc formularza lub kontrolki są one przetwarzane przez zestaw metod, które mogą zostać zastąpione. Każda z tych metod zwraca wartość Boolean określającą, czy komunikat klawiatury został przetworzony i użyty przez kontrolkę. Jeśli jedna z metod zwraca true
, komunikat jest traktowany jako obsługiwany i nie jest przekazywany do bazy lub elementu nadrzędnego kontrolki w celu dalszego przetwarzania. W przeciwnym razie komunikat pozostaje w kolejce komunikatów i może być przetwarzany w innej metodzie w podstawowej lub nadrzędnej kontrolce. W poniższej tabeli przedstawiono metody przetwarzania komunikatów klawiaturowych.
Metoda | Notatki |
---|---|
ProcessKeyMessage | Ta metoda przetwarza wszystkie komunikaty klawiaturowe odbierane przez metodę WndProc kontrolki. |
ProcessKeyPreview | Ta metoda wysyła wiadomość z klawiatury do rodzica kontrolki. Jeśli ProcessKeyPreview zwraca true , nie jest generowane żadne zdarzenie klucza, w przeciwnym razie ProcessKeyEventArgs jest wywoływana. |
ProcessKeyEventArgs | Ta metoda wywołuje odpowiednio zdarzenia KeyDown, KeyPressi KeyUp. |
Nadpisywanie metod klawiatury
Istnieje wiele metod zastępowania podczas wstępnego przetwarzania i przetwarzania komunikatu klawiatury; jednak niektóre metody są znacznie lepszymi wyborami niż inne. W poniższej tabeli przedstawiono zadania, które można wykonać, oraz najlepszy sposób zastąpienia metod klawiatury. Aby uzyskać więcej informacji na temat zastępowania metod, zobacz Zastępowanie właściwości i metod w klasach pochodnych.
Zadanie | Metoda |
---|---|
Przechwyć klucz nawigacji i zgłoś zdarzenie KeyDown. Na przykład chcesz, aby tabulator i funkcja Return została obsłużona w polu tekstowym. | Zastąpij IsInputKey.
Uwaga: Alternatywnie można obsłużyć zdarzenie PreviewKeyDown i ustawić IsInputKeyPreviewKeyDownEventArgs na true dla żądanego klucza lub kluczy. |
Wykonaj specjalną obsługę danych wejściowych lub nawigacji w elemencie sterującym. Na przykład chcesz użyć strzałek w kontrolce listy, aby zmienić wybrany element. | Nadpisz ProcessDialogKey |
Przechwyć klucz nawigacji i zgłoś zdarzenie KeyPress. Na przykład w kontrolce spin-box, chcesz, aby wielokrotne naciśnięcie klawiszy strzałek przyspieszało przechodzenie przez elementy. | Zastąpij IsInputChar. |
Wykonaj specjalną obsługę danych wejściowych lub nawigacji podczas zdarzenia KeyPress. Na przykład w kontrolce listy, przytrzymanie klawisza "r" powoduje przeskakiwanie między elementami rozpoczynającymi się na literę R. | Nadpisanie ProcessDialogChar |
Przeprowadzanie niestandardowej obsługi mnemoników; na przykład chcesz obsługiwać mnemoniki na przyciskach rysowanych przez system znajdujących się na pasku narzędzi. | Zastąpij ProcessMnemonic. |
Zobacz też
.NET Desktop feedback