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

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

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

【问题讨论】:

    标签: wpf tabs key-bindings ctrl


    【解决方案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
      猜你喜欢
      • 2013-03-06
      • 2011-01-19
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 2010-10-23
      • 2010-11-23
      • 2015-09-20
      • 2023-03-24
      相关资源
      最近更新 更多