2009-05-01 18 views
60

Lo que habría algún código de ejemplo que atrapará la Ctrl +Tab y Ctrl +Shift +Tab para una aplicación WPF?Cómo capturar Ctrl + Tab y Ctrl + Shift + Tab en WPF?

Hemos creado KeyDown eventos y también hemos intentado agregar enlaces de comando con gestos de entrada, pero nunca hemos sido capaces de atrapar estos dos accesos directos.

Respuesta

91

¿Qué controlador KeyDown tenía usted? El siguiente código funciona para mí. El que me da problemas es: Alt +Tab, pero no pidió que: D

public Window1() 
{ 
    InitializeComponent(); 
    AddHandler(Keyboard.KeyDownEvent, (KeyEventHandler)HandleKeyDownEvent); 
} 

private void HandleKeyDownEvent(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.Tab && (Keyboard.Modifiers & (ModifierKeys.Control | ModifierKeys.Shift)) == (ModifierKeys.Control | ModifierKeys.Shift)) 
    { 
     MessageBox.Show("CTRL + SHIFT + TAB trapped"); 
    } 

    if (e.Key == Key.Tab && (Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control) 
    { 
     MessageBox.Show("CTRL + TAB trapped"); 
    } 
} 
+0

Tam, gracias ... que funciona para nuestra WPF. También tenemos un XBAP que necesitamos atrapar esto y no parece funcionar en el XBAP. ¿Alguna idea sobre cómo hacer esto con un XBAP también? – FarrEver

+1

¿Hay una manera xamly de hacerlo? – Shimmy

+13

@siz Puede limpiar sus declaraciones If usando la siguiente sintaxis: 'Keyboard.Modifiers.HasFlag (ModifierKeys.Control)' – Pakman

8

Usted tiene que usar KeyUp caso, no KeyDown ...

+2

Interesante. No he intentado esto, pero ¿puedes explicar por qué? –

+7

Sure Siz. Cuando intenta capturar 2 o más trazos de tecla al mismo tiempo, no puede usar KeyDown comprobando e.Key porque captura una clave a la vez. Si KeyDown es necesario, como hacer algo cuando el usuario mantiene presionada una combinación de teclas, por ejemplo, debe usar KeyDown y la clase Keyboard, específicamente IsKeyDown(), para probar claves específicas. –

+1

Lo siento, no entiendo lo que intentas decir aquí. El evento KeyUp también solo pasa un único valor clave en e.Key. ¿Puedes dar un ejemplo específico donde manejar KeyUp en lugar de KeyDown sería mejor para "capturar 2 o más teclas al mismo tiempo"? Gracias. –

30

La respuesta de Gustavo fue exactamente lo que estaba buscando. Queremos validar las claves de entrada, pero todavía permiten pegar:

protected override void OnPreviewKeyDown(KeyEventArgs e) 
{ 
    if ((e.Key == Key.V || e.Key == Key.X || e.Key == Key.C) && Keyboard.IsKeyDown(Key.LeftCtrl)) 
     return; 
} 
+0

Lamentablemente, esto no se manejará cuando el usuario use el botón ctrl derecho :-) –

1

Hola usted puede utilizar esto en caso keydown

private void OnButtonKeyDown(object sender, KeyEventArgs e) 
    { 
     if(Keyboard.IsKeyDown(Key.LeftCtrl) && Keyboard.IsKeyDown(Key.Tab) && Keyboard.IsKeyDown(Key.LeftShift)) 
     { 
      // 
      // TODO: somthing here 
      // 
     } 
    } 
+0

El problema aquí también es que si agrego una instrucción if más con (Keyboard.IsKeyDown (Key.LeftCtrl) && Keyboard.IsKeyDown (Key.Tab))). Ambas sentencias se ejecutarán si presiono Ctrl + Shift + Tab – Devid

+0

, en este caso puede establecer cancel = true; en ambas declaraciones al presionar Ctrl + Shift + Tab – luka

1

versión de Szymon Rozga respuesta (Trabajando siento, no puedo comentar) No nos fijamos en Alt, pero es lo que representa se pueden añadir simplemente a primera si

public View() 
    { 
    InitializeComponent(); 
    AddHandler(Keyboard.PreviewKeyDownEvent, (KeyEventHandler)controlKeyDownEvent); 
    } 

    private void controlKeyDownEvent(object sender, KeyEventArgs e) 
    { 
    if (e.Key == Key.Tab && Keyboard.Modifiers.HasFlag(ModifierKeys.Control)) 
    { 
     if (Keyboard.Modifiers.HasFlag(ModifierKeys.Shift)) 
      MessageBox.Show("CTRL + SHIFT + TAB trapped"); 
     else 
      MessageBox.Show("CTRL + TAB trapped"); 
    } 
    } 
Cuestiones relacionadas