Udostępnij za pośrednictwem


Omówienie korzystania z klawiatury (Windows Forms .NET)

W formularzach Systemu Windows 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 będą mogły 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łużyć KeyPress zdarzenie w celu określenia kodu znaku, który został naciśnięty. 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 przetwarzają komunikaty systemu Windows w różnych punktach kolejki komunikatów. Wszystkie te metody mają Message parametr, który hermetyzuje szczegóły komunikatów systemu Windows niskiego poziomu. Można zaimplementować lub zastąpić te metody, aby zbadać komunikat, a następnie użyć komunikatu lub przekazać go do następnego konsumenta w kolejce komunikatów. W poniższej tabeli przedstawiono metody przetwarzania wszystkich komunikatów systemu Windows w formularzach Windows Forms.

Method Uwagi
PreFilterMessage Ta metoda przechwytuje komunikaty systemu Windows umieszczone w kolejce (znane również jako opublikowane) 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. Aby EnableNotifyMessage wywołać tę metodę, należy ustawić bit stylu.

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

Typy kluczy

Formularze systemu Windows identyfikują dane wejściowe klawiatury jako kody wirtualnych reprezentowane przez wyliczenie bitowe Keys . Za pomocą Keys wyliczenia można połączyć serię naciśniętych, 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 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 systemu Windows. Jeśli kombinacja naciśniętych powoduje wyświetlenie znaku, można wykryć znak, obsługując KeyPress zdarzenie.

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 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ść IsInputKey PreviewKeyDownEventArgs 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.

Method 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 Dziedziczenie (Przewodnik programowania w języku C#) lub Dziedziczenie (Visual Basic)

Zadanie Method
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ść IsInputKey PreviewKeyDownEventArgs 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ć 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 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 "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ż