如何在WPF中捕获Ctrl + Tab和Ctrl + Shift + Tab键?

69

有什么示例代码可以捕获WPF应用程序中的Ctrl+TabCtrl+Shift+Tab

我们已经创建了KeyDown事件,并尝试添加具有输入手势的命令绑定,但我们始终无法捕获这两个快捷键。

5个回答

101

你使用了哪个KeyDown事件处理程序?以下代码对我有效。让我烦恼的是:Alt + Tab,但你没有问那个: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");
   }
}

15
你可以使用以下语法来简化你的 If 语句:Keyboard.Modifiers.HasFlag(ModifierKeys.Control) - Pakman
1
有没有一种XAML的方法来做这件事? - Shimmy Weitzhandler
1
如何处理 Alt + Tab? - Sagar Pilkhwal
1
有很多赞,看起来似乎可以工作,但这是错误的。如果注释掉第一个“if”块,第二个块仍将捕获Ctrl+Shift+Tab。MessageBox会导致控件失去焦点。如果您保留两个“if”块的注释并将MessageBox替换为Console.WriteLine以捕获Ctrl+Shift+Tab,则也会看到“CTRL + TAB trapped”。在比较之前无法重置Keyboard.Modifiers上的标志。您必须比较确切的值。 - Aoi Karasu
1
(Keyboard.Modifiers & (ModifierKeys.Control | ModifierKeys.Shift)) == (ModifierKeys.Control | ModifierKeys.Shift) also captures Ctrl+Shift+Alt, so it seems better to me to use (Keyboard.Modifiers == (ModifierKeys.Control | ModifierKeys.Shift)) - rayzinnz
显示剩余2条评论

31

Gustavo的答案正是我所需要的。我们想要验证输入键,但仍允许粘贴:

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

遗憾的是,这将无法处理用户使用右侧Ctrl键的情况 :-) - Niels Harremoes

8

您需要使用KeyUp事件,而不是KeyDown事件...


2
有趣。我还没有尝试过,但你能解释一下为什么吗? - Szymon Rozga
7
当你试图同时捕获两个或更多按键时,你不能使用 KeyDown 检查 e.Key,因为它只会捕捉一个按键。如果 KeyDown 是必需的,比如当用户按下组合键时要执行某些操作,你应该使用 KeyDown 和 Keyboard 类,具体来说是 IsKeyDown(),用于测试特定的按键。 - Gus Cavalcanti
1
抱歉,我不明白你在这里想表达什么。KeyUp事件也只在e.Key中传递单个键值。你能否给出一个具体的例子,说明为什么处理KeyUp而不是KeyDown更好地“捕获同时按下2个或更多按键”?谢谢。 - Ray Burns
5
"KeyUp" 的想法在于,在 "KeyUp" 的时刻,所有的 "修改键" 都已经被按下了。你只需要检查它们,就能在同一个处理程序中找到整个键组合。如果你使用 "KeyDown",你很难区分 Shift+Ctrl(例如改变键盘布局)和 Shift+Ctrl+A。 - Be Brave Be Like Ukraine
两个事件(Up和Down)都有其存在的原因,这取决于具体的使用情况。在某些情况下,使用Down更好,例如,您想要重复绑定到按键的操作,只要按键被按下而无需反复点击按键。如果您想要防止由于错误而多次触发操作(按键被错误地按下太久),则最好使用Up。 - Aoi Karasu

5
这句话的翻译是:“Szymon Rozga的工作版本回答(很抱歉,我无法评论)。我们不考虑Alt,但如果需要,它的计算可以很容易地首先添加。”
  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");
     }
  }

1

嗨,您可以在按键按下事件上使用这个。

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

这里的问题也在于,如果我添加一个带有(Keyboard.IsKeyDown(Key.LeftCtrl)&& Keyboard.IsKeyDown(Key.Tab))的if语句,那么如果我按下Ctrl + Shift + Tab,两个语句都将被执行。 - Devid
在这种情况下,当按下 Ctrl+Shift+Tab 时,您可以在两个语句中设置 cancel=true;。 - luka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接