2012-05-06 10 views
12

Próbuję uzyskać reakcję klawiatury na małą aplikację Windows Form Application i mam zgrubne rozwiązanie, które ma zastąpić ProcessCmdKey. Jednakże napotykam kilka problemów i stwierdzam niespójności.Najważniejsze zdarzenia: ProcessCmdKey

różnych zdarzeń: Czy istnieje sposób, aby powiedzieć, w argumentach ref Message msg, Keys keyData, czy nawet to KeyDown, A KeyUp lub naciśnięcie klawisza?

przyciśnięcie: Wszędzie patrzę mówi, że KeyPress, czyli wielokrotnego wejścia klawiatury, zdarza się tylko do klawiszy znakowych, które klawisze strzałek nie są. Jednak procedura obsługi zdarzenia jest wywoływana tak często i w tym samym mannor/z tym samym zachowaniem, dla klawiszy strzałek, jak klawisze znaków. Czy dzieje się to w przypadku zdarzenia KeyPress, czy jest to coś innego?

Idealnie podoba mi się sposób obsługi, na poziomie formularza, wszystkich wydarzeń na klawiaturze, bez konieczności przekazywania ich do formantów w formularzu. Jednak cała dokumentacja wystarczająco mnie pomyliła i pominęła kluczowe punkty, więc nie byłem w stanie jej wykonać.

Pomoc na którykolwiek z tych tematów jest doceniana. Dzięki!

Odpowiedz

12

The Message struktury przekazanego ProcessCmdKey() zawiera numer komunikatu WINAPI w Msg właściwości:

  • WM_KEYDOWN jest 0x100 (256)
  • WM_KEYUP jest 0x101 (257),
  • WM_CHAR (w przybliżeniu równa to KeyPress) to 0x102 (258),
  • WM_SYSKEYDOWN to 0x104 (260),
  • to 0x105 (261).

chodzi o pytanie o KeyPress, prawdą jest, że klucze nie znaków takich jak klawiszy strzałek nie generują WM_CHAR wiadomości wewnętrznie, ale robią generować WM_KEYDOWN, a wiadomość zostanie również wysłany wielokrotnie do ponownego wejścia.

Należy również pamiętać, że nie jestem pewien, czy ProcessCmdKey() jest właściwą metodą osiągnięcia tego, co chcesz. Dokumentacja opisuje to jako obsługę tylko main menu command keys and MDI accelerators, która może być tylko podzbiorem kluczy, które chcesz przechwycić. Zamiast tego możesz zastąpić ProcessKeyPreview(), która obsługuje wszystkie komunikaty klawiatury odebrane przez elementy sterujące podrzędne.

40

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.

Powiązane problemy