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ń:
- Użytkownik wypycha klucz "a", klucz jest wstępnie przetworzony, wysłany i KeyDown występuje zdarzenie.
- 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.
- 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 true wartość , komunikat klucza nie zostanie wysłany i nie wystąpi zdarzenie klucza. Jeśli zwraca false wartość , 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 true wartość , oznacza to, że kontrolka jest zwykłym znakiem, a KeyDown zdarzenie jest zgłaszane. Jeśli false parametr 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 true wartość , przetwarzanie wstępne zostanie ukończone i nie zostanie wygenerowane kluczowe zdarzenie. Jeśli zwraca false wartość , 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 true wartość , 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 true wartość 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 true
wartość , 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 true wartość , 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ż
- Keys
- WndProc
- PreProcessMessage
- Używanie zdarzeń klawiatury (Windows Forms .NET)
- Modyfikowanie zdarzeń klawiatury (Windows Forms .NET)
- How to Check for modifier key presses (Windows Forms .NET)
- Jak symulować zdarzenia klawiatury (Windows Forms .NET)
- Jak obsługiwać komunikaty wejściowe klawiatury w formularzu (Windows Forms .NET)
- Dodawanie kontrolki (Windows Forms .NET)
.NET Desktop feedback