Udostępnij przez


Omówienie korzystania z klawiatury

W formularzach Windows Forms dane wejściowe użytkownika są wysyłane do aplikacji w postaci komunikatów systemu Windows . Seria metod zastępowalnych przetwarza te komunikaty na poziomie aplikacji, formularza i kontrolki. Gdy te metody odbierają komunikaty klawiaturowe, zgłaszają zdarzenia, które można obsłużyć, aby uzyskać informacje o danych wejściowych klawiatury. W wielu przypadkach aplikacje Windows Forms mogą przetwarzać wszystkie dane wejściowe użytkownika po prostu przez obsługę tych zdarzeń. W innych przypadkach aplikacja może wymagać zastąpienia jednej z metod przetwarzania komunikatów w celu przechwycenia określonego komunikatu przed odebraniem go przez aplikację, formularz lub kontrolkę.

Zdarzenia klawiatury

Wszystkie kontrolki Windows Forms dziedziczą zestaw zdarzeń związanych z wprowadzaniem myszy i klawiatury. Na przykład kontrolka może obsługiwać zdarzenie KeyPress w celu określenia kodu znaku naciśniętego klawisza. Aby uzyskać więcej informacji, zobacz Używanie zdarzeń klawiatury.

Metody przetwarzania komunikatów wejściowych użytkownika

Formularze i kontrolki mają dostęp do interfejsu IMessageFilter oraz zestawu metod, które można przesłonić i które przetwarzają komunikaty systemu Windows na różnych etapach w kolejce komunikatów. Wszystkie te metody mają parametr Message, który hermetyzuje szczegóły komunikatów systemu Windows niskiego poziomu. Można zaimplementować lub zastąpić te metody, aby zbadać komunikat, a potem przetworzyć go lub przekazać do następnego konsumenta w kolejce. W poniższej tabeli przedstawiono metody przetwarzania wszystkich komunikatów systemu Windows w formularzach Windows Forms.

Metoda Notatki
PreFilterMessage Ta metoda przechwytuje umieszczone w kolejce (znane również jako wysłane) komunikaty systemu Windows na poziomie aplikacji.
PreProcessMessage Ta metoda przechwytuje komunikaty systemu Windows na poziomie formularza i kontrolki przed ich przetworzeniem.
WndProc Ta metoda przetwarza komunikaty systemu Windows na poziomie formularza i kontrolki.
DefWndProc Ta metoda wykonuje domyślne przetwarzanie komunikatów systemu Windows na poziomie formularza i kontrolki. Zapewnia to minimalną funkcjonalność okna.
OnNotifyMessage Ta metoda przechwytuje komunikaty na poziomie formularza i kontrolki po ich przetworzeniu. Bit stylu EnableNotifyMessage musi być ustawiony, aby wywołać tę metodę.

Komunikaty za pomocą klawiatury i myszy są przetwarzane przez dodatkowy zestaw metod zastępowalnych, które są specyficzne dla tego typu komunikatów. Aby uzyskać więcej informacji, zobacz sekcję Klucze wstępnego przetwarzania.

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 w celu uzyskania pojedynczej wartości. Te wartości odpowiadają wartościom towarzyszącym komunikatom WM_KEYDOWN i WM_SYSKEYDOWN systemu Windows. Możesz wykryć większość fizycznych naciśnięć klawiszy, obsługując zdarzenia KeyDown lub KeyUp. Klawisze znaków są podzbiorem enumeracji 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 do klawiatury (Visual Basic).

Kolejność zdarzeń klawiatury

Jak wspomniano wcześniej, istnieją trzy zdarzenia związane z klawiaturą, które mogą wystąpić w kontrolce. Poniższa sekwencja przedstawia ogólną kolejność zdarzeń:

  1. Użytkownik wciska klawisz A, klawisz jest wstępnie przetwarzany, przekazywany i występuje zdarzenie KeyDown.
  2. Użytkownik trzyma klawisz A, klawisz jest wstępnie przetwarzany, wysyłany i występuje zdarzenie KeyPress. To zdarzenie występuje wiele razy, gdy użytkownik przechowuje klucz.
  3. Użytkownik zwalnia klawisz A, klawisz jest wstępnie przetworzony, wysłany, i występuje 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, zanim kontrolka przetworzy komunikaty. 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 zwróci wartość true, komunikat klucza nie zostanie rozesłany i nie wystąpi zdarzenie kluczowe. Jeśli zwraca false, IsInputKey jest nazywane.
Sprawdź, czy klawisz specjalny wymaga wstępnego przetwarzania lub czy normalny klawisz znakowy powinien zgłosić zdarzenie KeyDown i zostać przekazany do kontrolki. IsInputKey Jeśli metoda zwraca true, oznacza to, że kontrolka jest standardowym znakiem, a zdarzenie KeyDown jest wywoływane. 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ź klawisz nawigacyjny (ESC, TAB, Enter 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 bezpośrednia kontrolka nie obsługuje klucza, wywoływany jest element ProcessDialogKey na kontrolce nadrzędnej, i tak dalej, aż do najwyższej kontrolki w hierarchii. Jeśli ta metoda zwróci true, przetwarzanie wstępne zostanie ukończone i nie wygeneruje zdarzenia kluczowego. 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 ProcessDialogChar jest wywoływane.
Sprawdź, czy znak jest mnemoniczny (na przykład &OK na guziku) ProcessDialogChar Ta metoda, podobna do ProcessDialogKey, jest wywoływana w ramach hierarchii sterowania. Jeśli kontrolka jest kontrolką kontenera, sprawdza ona mnemoniki, wywołując ProcessMnemonic na nią samą i swoje kontrolki podrzędne. Jeśli ProcessDialogChar zwraca true wartość KeyPress, zdarzenie nie występuje.

Przetwarzanie komunikatów klawiaturowych

Gdy komunikaty klawiaturowe docierają do metody WndProc formularza lub kontrolki, są przetwarzane przez zestaw metod, które można przesłonić. 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 wartość true, komunikat jest uznawany za obsłużony i nie jest przekazywany do bazowej klasy kontrolki lub jej elementu nadrzędnego w celu dalszego przetwarzania. W przeciwnym razie komunikat pozostaje w kolejce wiadomości i może zostać przetworzony 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.

Przesłanianie metod obsługi klawiatury

Istnieje wiele metod zastępowania podczas wstępnego przetwarzania i przetwarzania komunikatu klawiatury; jednak niektóre metody są 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 Dziedziczenie (Przewodnik programowania w języku C#) lub Dziedziczenie (Przewodnik programowania w języku Visual Basic)

Zadanie Metoda
Przechwyć klucz nawigacji i zgłoś zdarzenie KeyDown. Na przykład chcesz, aby Tab i Enter były obsługiwane w polu tekstowym. Zastąpij IsInputKey. 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 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 przeskakuje między elementami rozpoczynającymi się literą r. Nadpisz ProcessDialogChar
Wykonaj niestandardową obsługę mnemoniki; na przykład, jeśli chcesz obsługiwać mnemoniki na przyciskach rysowanych przez właściciela znajdujących się na pasku narzędzi. Zastąpij ProcessMnemonic.

Zobacz także