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

Far*_*ver 66 wpf tabs key-bindings ctrl

什么样的代码会捕获WPF应用程序的Ctrl+ TabCtrl+ Shift+ Tab

我们已经创建了KeyDown事件,并尝试使用输入手势添加命令绑定,但我们永远无法捕获这两个快捷方式.

Szy*_*zga 93

你有什么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");
   }
}
Run Code Online (Sandbox Code Playgroud)

  • @siz您可以使用以下语法清理If语句:`Keyboard.Modifiers.HasFlag(ModifierKeys.Control)` (14认同)

小智 31

古斯塔沃的回答正是我所寻找的.我们想验证输入密钥,但仍然允许粘贴:

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


Gus*_*nti 8

你必须使用KeyUp事件,而不是KeyDown......

  • 当然是Siz.当您尝试同时捕获2个或更多击键时,您无法使用Key.Down检查e.Key,因为它一次捕获一个键.如果需要KeyDown,比如在用户按住组合键时执行某些操作,则应使用KeyDown和Keyboard类,特别是IsKeyDown()来测试特定键. (7认同)
  • @RayBurns捕获KeyUp背后的想法是,在KeyUp时刻,所有"修饰符"键都已被按下.您只需要检查它们以找出同一处理程序中的整个组合键.如果您使用KeyDown,则很难从Shift + Ctrl + A告诉Shift + Ctrl(例如更改键盘布局). (5认同)
  • 有趣.没有试过这个,但你可以解释一下原因吗? (2认同)

Lev*_*Lev 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");
     }
  }
Run Code Online (Sandbox Code Playgroud)