Nadpisanie klucza ProcessCmdKey w formularzu jest wyraźnie przeznaczone do umożliwienia implementacji niestandardowego skrótowego naciśnięcia klawisza poza wbudowaną obsługa mnemoników w przyciskach i elementach menu.
Jest wywoływany tylko w przypadku zdarzenia z kluczem w dół, przed kontrola z fokusem dostaje zdarzenie KeyDown i niezależnie od tego, na którym obiekcie koncentruje się klient. Nie jest więc związany z KeyUp, a nie z KeyPress. Zwracasz wartość true z nadpisania, gdy rozpoznasz klucz po wykonaniu funkcji skrótu. Zapobiega to dalszemu przetwarzaniu klucza, nie generuje żadnych zdarzeń KeyDown/Press/Up.
Jest to bardzo rzadko zdarza się korzystać z msg argumentu metody, wartość msg.Msg będzie tylko kiedykolwiek być WM_KEYDOWN lub WM_SYSKEYDOWN z ostatnim komunikatem produkowanego gdy użytkownik wciśnięty klawisz Alt. Którego nie obchodzi, ponieważ zawsze można uzyskać od argumentu keyData. W ten sposób:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
if (keyData == (Keys.Alt | Keys.F)) {
// Alt+F pressed
doSomething();
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
Inne modyfikatory, które możesz chcieć sprawdzić za pomocą | Operator, jak tu stosowane, to Keys.Shift i Keys.Control. Tak więc (Keys.Shift | Keys.Control | Keys.F1) sprawdza Ctrl + Shift + F1. Możesz może interpretować dane msg, gdy chcesz zrobić coś niezwykłego, jak sprawdzanie powtarzających się kluczy. Sprawdź dokument MSDN dla powiadomienia WM_KEYDOWN. Wartość msg.LParam zawiera garść informacji o naciśnięciu klawisza.
Należy pamiętać, że w tej metodzie są dostępne tylko klucze wirtualne. Keys.F to klawisz F w układzie klawiatury angielskiej, ale niekoniecznie taka sama litera dla klucza w tej samej lokalizacji w układzie użytkownika. Korzystaj z klawiszy funkcyjnych, aby uniknąć problemów z dokumentacją.
Powtarzanie klawiszy jest funkcją kontrolera klawiatury i nie jest ograniczone do wpisywania klawiszy. Klawisze strzałek i klawiszy funkcyjnych z pewnością powtarzają się po przytrzymaniu. Chcesz zignorować KeyPress w tym scenariuszu. Ale jeśli przypiszesz klawisz skrótu do klawisza, który jest również klawiszem do pisania (jak Keys.F), to chcesz zawsze również sprawdzić klawisz modyfikujący, aby nie złamać formantów, takich jak TextBox.
Nie można również zapomnieć o wbudowanej obsłudze mnemoników w przyciskach i elementach menu. Wpisanie właściwości Text, takiej jak &OK
, powoduje utworzenie samokodującego się skrótu bez potrzeby podawania jakiegokolwiek kodu. Obsługiwane przez użytkownika, w tym przykładzie, przez naciśnięcie Alt + O.