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

Posted

技术标签:

【中文标题】如何在 WPF 中捕获 Ctrl + Tab 和 Ctrl + Shift + Tab?【英文标题】:How to capture Ctrl + Tab and Ctrl + Shift + Tab in WPF? 【发布时间】:2010-10-23 05:44:52 【问题描述】:

哪些示例代码会捕获 Ctrl+TabCtrl+Shift+Tab?

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

@siz 您可以使用以下语法清理您的 If 语句:Keyboard.Modifiers.HasFlag(ModifierKeys.Control) 有 xamly 的方法吗? 如何处理 Alt+Tab ? 这么多的赞成票,它似乎工作,但这是错误的。如果您注释掉第一个“if”块,第二个仍将捕获 Ctrl+Shift+Tab。 MessageBox 使控件失去焦点。如果您将两个“if”块都保留为未注释并将 MessageBox 替换为 Console.WriteLine 用于 Ctrl+Shift+Tab,您也会看到“CTRL + TAB 被困”。在比较之前,您无法重置 Keyboard.Modifiers 上的标志。您必须比较确切的值。 (Keyboard.Modifiers & (ModifierKeys.Control | ModifierKeys.Shift)) == (ModifierKeys.Control | ModifierKeys.Shift) 也捕获了 Ctrl+Shift+Alt,所以对我来说使用(Keyboard.Modifiers == (ModifierKeys.Control | ModifierKeys.Shift)) 似乎更好【参考方案2】:

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 按钮时,这将无法处理 :-)【参考方案3】:

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

【讨论】:

有趣。没试过,能解释一下原因吗? 确定。当您尝试同时捕获 2 个或更多击键时,您不能使用 KeyDown 检查 e.Key,因为它一次捕获一个键。如果需要 KeyDown,例如当用户按住组合键时执行某些操作,您应该使用 KeyDown 和 Keyboard 类,特别是 IsKeyDown(),测试特定键。 对不起,我不明白你在这里想说什么。 KeyUp 事件也只在 e.Key 中传递一个 Key 值。您能否举一个具体的例子,说明处理 KeyUp 而不是 KeyDown 对于“同时捕获 2 个或更多击键”会更好?谢谢。 @RayBurns 捕获 KeyUp 背后的想法是,在 KeyUp 的那一刻,所有“修饰符”键都已被按下。您只需要检查它们以找出同一处理程序中的整个组合键。如果您改用 KeyDown,则很难从 Shift+Ctrl+A 告诉 Shift+Ctrl(例如更改键盘布局)。 Up 和 Down 事件都是有原因的。一切都取决于用例。在某些情况下,使用 Down 会更好,例如。只要按下它,您就想重复绑定到它们的键的动作,而无需反复敲击它们的键。如果您想防止动作触发多次错误(错误地按下键太久),您更喜欢使用 Up。【参考方案4】:

Szymon Rozga 答案的工作版本(抱歉,我无法发表评论)。我们不看Alt,但是一开始可以简单地添加它的会计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");
     
  

【讨论】:

【参考方案5】:

您好,您可以在 keydown 事件中使用它

 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 将执行这两个语句 这种情况下可以设置cancel=true;在两个语句中同时按下 Ctrl+Shift+Tab

以上是关于如何在 WPF 中捕获 Ctrl + Tab 和 Ctrl + Shift + Tab?的主要内容,如果未能解决你的问题,请参考以下文章

用于 RibbonTab 的 WPF IsSelected 绑定在 ctrl+tab 上停止工作

为啥我的 WPF KeyDown 处理程序没有捕获 CTRL+A?

转换为 WPF 的本机控件未捕获制表键

在文本框中捕获TAB键[关闭]

在文本框中捕获 TAB 键 [关闭]

WPF 键盘导航附加属性解决TreeView的Tab导航焦点问题