Udostępnij za pośrednictwem


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ń:

  1. Użytkownik naciska klawisz "a", klawisz jest wstępnie przetwarzany, przesyłany i występuje zdarzenie KeyDown.

  2. 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.

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