How to capture Ctrl + Tab and Ctrl + Shift + Tab in WPF?

WpfTabsKey BindingsCtrl

Wpf Problem Overview


What would be some sample code that will trap the Ctrl+Tab and Ctrl+Shift+Tab for a WPF application?

We have created KeyDown events and also tried adding command bindings with input gestures, but we were never able to trap these two shortcuts.

Wpf Solutions


Solution 1 - Wpf

What KeyDown handler did you have? The code below works for me. The one that gives me trouble is: Alt + Tab, but you didn't ask for that :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");
   }
}

Solution 2 - Wpf

Gustavo's answer was exactly what I was looking for. We want to validate input keys, but still allow pasting:

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

Solution 3 - Wpf

You have to use KeyUp event, not KeyDown...

Solution 4 - Wpf

Working version of Szymon Rozga answer (sorry, I can't comment). We don't look on Alt, but it's accounting can be simply added at first if

  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");
     }
  }

Solution 5 - Wpf

Hi you can use this on keydown event

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionFarrEverView Question on Stackoverflow
Solution 1 - WpfSzymon RozgaView Answer on Stackoverflow
Solution 2 - WpfmikeBView Answer on Stackoverflow
Solution 3 - WpfGus CavalcantiView Answer on Stackoverflow
Solution 4 - WpfLevView Answer on Stackoverflow
Solution 5 - WpflukaView Answer on Stackoverflow