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


67

将为WPF应用程序捕获Ctrl+TabCtrl+ Shift+的示例代码是Tab什么?

我们已经创建了KeyDown事件,还尝试添加带有输入手势的命令绑定,但是我们永远无法捕获这两个快捷方式。

Answers:


94

您有什么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");
   }
}

14
@siz您可以使用以下语法来清理If语句:Keyboard.Modifiers.HasFlag(ModifierKeys.Control)
Pakman 2010年

1
有没有这样做的方法?
Shimmy Weitzhandler

1
如何处理Alt + Tab?
Sagar Pilkhwal 2015年

1
如此之多的投票赞成,而且似乎奏效,但这是错误的。如果您注释掉第一个“ if”块,则第二个仍将捕获Ctrl + Shift + Tab。MessageBox导致控件失去焦点。如果不对两个“ if”块都进行注释,并用Console.WriteLine替换Ctrl + Shift + Tab的MessageBox,则也会看到“ CTRL + TAB被困”。比较之前,您无法在Keyboard.Modifiers上重置标志。您必须比较确切的值。
Aoi Karasu

1
(Keyboard.Modifiers & (ModifierKeys.Control | ModifierKeys.Shift)) == (ModifierKeys.Control | ModifierKeys.Shift)还捕获了Ctrl + Shift + Alt,所以对我来说似乎更好用(Keyboard.Modifiers == (ModifierKeys.Control | ModifierKeys.Shift))
rayzinnz

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

遗憾的是,当用户使用右侧ctrl按钮时,这将无法处理:-)
Niels Harremoes 17-4-6

8

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


2
有趣。还没有尝试过,但是请您解释一下原因?
Szymon Rozga,2009年

7
当然可以 当您尝试同时捕获2个或更多键击时,无法对e.Key使用KeyDown检查,因为它一次捕获一个键。如果需要KeyDown,例如当用户按住某个组合键时需要执行某些操作,则应使用KeyDown和Keyboard类,特别是IsKeyDown()来测试特定的键。
Gus Cavalcanti

1
抱歉,我不明白您要在这里说什么。KeyUp事件还仅在e.Key中传递单个Key值。您能否举一个具体的示例,说明“同时捕获2个或更多击键”比处理KeyUp更好。谢谢。
雷·伯恩斯

5
@RayBurns捕获KeyUp的想法是,在KeyUp时,已经按下了所有“修饰符”键。您只需要检查它们即可找出同一处理程序中的整个键组合。如果使用KeyDown,则很难从Shift + Ctrl + A告诉Shift + Ctrl(例如更改键盘布局)。
bytebuster

向上和向下事件都被公开是有原因的。一切都取决于用例。在某些情况下,使用Down更好。您只要重复按下它们就可以重复绑定到它们的动作,而无需反复点击它们。如果您想防止触发更多动作,而您又不希望一次触发(误按该键太长时间),则最好使用Up。
Aoi Karasu

4

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

在这种情况下,您可以设置cancel = true; 在两个语句中按Ctrl + Shift + Tab
卢卡
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.