2010-06-23 8 views
25

Ho un codice che è (dovrebbe essere) che cattura i tasti. La finestra di livello superiore ha una clausolaPreviewKeyDown non visualizza i modificatori Alt

Keyboard.PreviewKeyDown="Window_PreviewKeyDown" 

e il file CS sostegno contiene:

private void Window_PreviewKeyDown(object sender, KeyEventArgs e) { 
    if (e.KeyboardDevice.Modifiers == ModifierKeys.Control) { 
     switch (e.Key) { 
      case Key.L: 
       btnPrev_Click(sender, new RoutedEventArgs()); 
       e.Handled = true; 
       break; 
      case Key.R: 
       btnNext_Click(sender, new RoutedEventArgs()); 
       e.Handled = true; 
       break; 
     } 
    } 
} 

Ora che funziona bene, sia CTRLL e CTRLR chiamata del relativo funzioni.

Non appena cambio il controllo Modifer per utilizzare ModifierKeys.Alt, smette di funzionare. In altre parole, né ALTL e ALTR chiamata funzioni.

Cosa mi manca qui?

risposta

40

In caso di Alt modificatore, e.Key rendimenti Key.System e la vera chiave è in e.SystemKey. È possibile utilizzare il seguente pezzo di codice per ottenere sempre il corretto tasto premuto:

Key key = (e.Key == Key.System ? e.SystemKey : e.Key); 
+0

impressionante. Molte grazie. – mbaytas

47

Il guaio è che quando Alt viene tenuto premuto tuoi KeyEventArgs ha:

Key = Key.System 
SystemKey = the real key 

in modo che quando il controllo di Alt è necessario utilizzare e.SystemKey invece di e.Key, in questo modo:

if (e.KeyboardDevice.Modifiers == ModifierKeys.Alt) { 
    switch (e.SystemKey) { 
     ... 

Spiegazione

Sotto Windows, il tasto "Alt" è gestito in modo speciale. Quando si preme il tasto Alt stesso o si preme un altro tasto mentre si tiene premuto il tasto Alt, viene considerata una pressione del tasto "Sistema". I tasti "Sistema" vengono gestiti in modo diverso rispetto ai normali pressioni dei tasti in molti modi.

Tutto inizia quando Windows passa il tasto di pressione all'applicazione. I normali eventi down del tasto generano un WM_KEYDOWN, ma se viene premuto il tasto Alt genera un WM_SYSKEYDOWN. Allo stesso modo un WM_KEYUP è tradotto in un WM_SYSKEYUP.

In Windows, incluso in WPF, la gestione speciale del tasto Alt viene utilizzata con MenuItems, pulsanti ed etichette che includono "testo di accesso". Ad esempio, se un pulsante ha il contenuto di "Say _Hi", quindi presing Alt-H verrà considerato come un clic del pulsante.

Quando il tasto Alt è disattivato, le lettere si presentano come tre coppie di eventi: KeyDown, KeyUp e TextInput, ciascuna con le relative versioni di anteprima. Le differenze principali sono qui:

  • Gli eventi KeyDown e KeyUp hanno la loro proprietà Key impostata su "Key.System", piuttosto che la chiave effettiva che è stato premuto, e lo SystemKey impostato sulla chiave effettiva premuto.
  • evento La TextInput viene passato normalmente, ma poi gestito come un AccessKey se non si consuma
+0

Il secondo blocco di codice dovrebbe essere "ModifierKeys.Alt"? – paxdiablo

+1

Grazie, Ray, la spiegazione è stata un ulteriore bonus quindi +1 per quello. – paxdiablo

+1

Ottima spiegazione! +1 per voi Sir – Arcturus

Problemi correlati