Działanie wprowadzania z klawiatury

Formularze systemu Windows przetwarza dane wejściowe klawiatury przez podnoszenie 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 przed dotarciem 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 (Używanie zdarzeń klawiatury).

Typy kluczy

Formularze systemu Windows identyfikują dane wejściowe klawiatury jako kody klawiszy wirtualnych reprezentowane przez wyliczenie bitowe Keys . Za pomocą Keys wyliczenia można połączyć serię naciśniętych klawiszy, aby uzyskać pojedynczą wartość. Te wartości odpowiadają wartościom towarzyszącym komunikatom WM_KEYDOWN i WM_SYSKEYDOWN systemu Windows. Większość naciśnięcia klawiszy fizycznych można wykryć, obsługując KeyDown zdarzenia lub KeyUp . Klucze znaków są podzbiorem Keys wyliczenia i odpowiadają wartościom towarzyszącym komunikatom WM_CHAR i WM_SYSCHAR windows. Jeśli kombinacja klawiszy naciśniętych powoduje wyświetlenie znaku, można wykryć znak, obsługując KeyPress zdarzenie. Alternatywnie możesz użyć funkcji Keyboard, uwidocznionej przez interfejs programowania języka Visual Basic, aby dowiedzieć się, które klawisze zostały naciśnięte i wysłać klawisze. Aby uzyskać więcej informacji, zobacz Uzyskiwanie dostępu do klawiatury.

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 wypycha klucz "a", klucz jest wstępnie przetworzony, wysłany i KeyDown występuje zdarzenie.

  2. Użytkownik przechowuje klucz "a", klucz jest wstępnie przetworzony, wysłany i KeyPress występuje zdarzenie.

    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 KeyUp występuje zdarzenie.

Klucze przetwarzania wstępnego

Podobnie jak inne komunikaty, komunikaty klawiaturowe są przetwarzane w WndProc metodzie formularza lub kontrolki. Jednak przed przetworzeniem PreProcessMessage komunikatów klawiaturowych metoda wywołuje jedną lub więcej metod, które można zastąpić w celu obsługi klawiszy 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 Uwagi
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 zwróci truewartość , komunikat klucza nie zostanie wysłany i nie wystąpi zdarzenie klucza. Jeśli zwraca falsewartość , IsInputKey jest wywoływana.
Sprawdź klucz specjalny, który wymaga wstępnego przetwarzania lub normalnego klucza znaku, który powinien zgłosić KeyDown zdarzenie i zostać wysłany do kontrolki. IsInputKey Jeśli metoda zwraca truewartość , oznacza to, że kontrolka jest zwykłym znakiem, a KeyDown zdarzenie jest zgłaszane. Jeśli falseparametr ProcessDialogKey jest wywoływany. Uwaga: aby upewnić się, że kontrolka pobiera klucz lub kombinację kluczy, możesz obsłużyć PreviewKeyDown zdarzenie i ustawić wartość IsInputKeyPreviewKeyDownEventArgs na true dla odpowiedniego klucza lub kluczy.
Sprawdź klucz nawigacji (ESC, TAB, Return lub arrow keys). ProcessDialogKey Ta metoda przetwarza klucz fizyczny, który wykorzystuje specjalne funkcje w kontrolce, takie jak przełączanie fokusu między kontrolką a jej elementem nadrzędnym. Jeśli natychmiastowa kontrolka nie obsługuje klucza, ProcessDialogKey element jest wywoływany w kontrolce nadrzędnej i tak dalej do najbardziej górnej kontrolki w hierarchii. Jeśli ta metoda zwróci truewartość , przetwarzanie wstępne zostanie ukończone i nie zostanie wygenerowane kluczowe zdarzenie. Jeśli zwraca falsewartość , KeyDown wystąpi zdarzenie.

Wstępne przetwarzanie dla zdarzenia KeyPress

Akcja Powiązana metoda Uwagi
Sprawdź, czy klucz jest normalnym znakiem, który powinien zostać przetworzony przez kontrolkę IsInputChar Jeśli znak jest normalnym znakiem, ta metoda zwraca truewartość , KeyPress zdarzenie jest wywoływane i nie ma dalszego przetwarzania wstępnego. W przeciwnym razie ProcessDialogChar zostanie wywołana.
Sprawdź, czy znak jest mnemonic (np. &OK na przycisku) ProcessDialogChar Ta metoda podobna do ProcessDialogKeymetody zostanie wywołana w hierarchii sterowania. Jeśli kontrolka jest kontrolką kontenera, sprawdza mnemonics przez wywołanie ProcessMnemonic samego siebie i jego kontrolek podrzędnych. Jeśli ProcessDialogChar zwraca truewartość KeyPress , zdarzenie nie występuje.

Przetwarzanie komunikatów klawiaturowych

Po dotarciu WndProc komunikatów klawiaturowych do metody formularza lub kontrolki są one przetwarzane przez zestaw metod, które można zastąpić. Każda z tych metod zwraca wartość określającą Boolean , czy komunikat klawiatury został przetworzony i użyty przez kontrolkę. Jeśli jedna z metod zwraca truewartość , 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 Uwagi
ProcessKeyMessage Ta metoda przetwarza wszystkie komunikaty klawiaturowe odbierane przez WndProc metodę kontrolki.
ProcessKeyPreview Ta metoda wysyła komunikat klawiatury do elementu nadrzędnego kontrolki. Jeśli ProcessKeyPreview zwraca truewartość , nie jest generowane żadne zdarzenie klucza, w przeciwnym razie ProcessKeyEventArgs jest wywoływane.
ProcessKeyEventArgs Ta metoda wywołuje KeyDownodpowiednio zdarzenia , KeyPressi KeyUp .

Zastępowanie 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łosić KeyDown zdarzenie. Na przykład chcesz, aby tabulator i funkcja Return została obsłużona w polu tekstowym. Zastąpij .IsInputKey Uwaga: alternatywnie możesz obsłużyć PreviewKeyDown zdarzenie i ustawić wartość IsInputKeyPreviewKeyDownEventArgs na true dla klucza lub kluczy, które chcesz.
Wykonaj specjalną obsługę danych wejściowych lub nawigacji w kontrolce. Na przykład chcesz użyć klawiszy strzałek w kontrolce listy, aby zmienić wybrany element. Zastąpić ProcessDialogKey
Przechwyć klucz nawigacji i zgłosić KeyPress zdarzenie. Na przykład w kontrolce spin-box chcesz, aby wiele naciśnięcia klawiszy strzałek przyspieszyć postęp przez elementy. Zastąpij .IsInputChar
Wykonaj specjalną obsługę danych wejściowych lub nawigacyjnych podczas zdarzenia KeyPress . Na przykład w kontrolce listy trzymającej klawisz "r" pomija między elementami rozpoczynającymi się literą r. Zastąpić ProcessDialogChar
Wykonywanie niestandardowej obsługi mnemonic; na przykład chcesz obsługiwać mnemonics na przyciskach narysowanych przez właściciela znajdujących się na pasku narzędzi. Zastąpij .ProcessMnemonic

Zobacz też