【问题标题】:How to detect modifier key states in WPF?如何检测 WPF 中的修饰键状态?
【发布时间】:2011-08-10 16:18:10
【问题描述】:

是否有一些全局结构可以在我需要访问 Control、Shift、Alt 按钮是否按下时使用?例如在TreeViewMouseDown 事件中。

如果有怎么办?

【问题讨论】:

    标签: c# .net wpf keyboard


    【解决方案1】:

    使用类Keyboard。使用Keyboard.IsKeyDown 可以检查Control、Shift、Alt 现在是否关闭。

    换班:

    if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift))
    { /* Your code */ }
    

    对于控制:

    if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))
    { /* Your code */ }
    

    对于 Alt:

    if (Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt))
    { /* Your code */ }
    

    【讨论】:

      【解决方案2】:

      还有:

      // Have to get this value before opening a dialog, or user will have released the control key
      if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)
      {
      
      }
      

      【讨论】:

      • 更好的解决方案。它还允许您一次检查所有修饰符。如果你想处理 Ctrl+F,你不会想处理 Ctrl+Shift+F,所以你可以只检查 (e.Key == Key.F && e.KeyboardDevice.Modifiers == ModifierKeys.Control) 而不是所有其他的东西......
      • 请注意,以上示例中的比较会产生不同的结果!由于 ModifierKeys 枚举具有 Flags 属性,因此您可以在枚举中具有任何值组合。如果您只想捕捉按下的 shift 键,请使用 Keyboard.Modifiers == ModifierKeys.Shift 语句。如果您想捕捉 shift 键但不关心是否同时按下其他修饰符,请使用 (Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift 或更好的 HasFlag 语法 Keyboard.Modifiers.HasFlag(ModifierKeys.Shift)
      • 我无法使用此方法捕获 Windows 键修饰符。 (CTRL 工作正常。)我试图抓住WIN+RightArrow
      • @ANeves 有趣,Keyboard.Modifiers 显示为None
      【解决方案3】:
          private bool IsShiftKey { get; set; }
      
          private void OnPreviewKeyDown(object sender, KeyEventArgs e)
          {
              IsShiftKey = Keyboard.Modifiers == ModifierKeys.Shift ? true : false;
      
              if ((Key.Oem3 == e.Key || ((IsShiftKey && Key.Oem4 == e.Key) || (IsShiftKey && Key.Oem6 == e.Key) || (IsShiftKey && Key.Oem5 == e.Key)) && (validatorDefn as FormatValidatorDefinition).format == "packedascii"))
              {
                 e.Handled = true;
              }
          }
      

      【讨论】:

      • 用注释和代码更好地回答。请提供一些背景信息。
      • 将其添加为属性的好主意
      • 当我使用 PreviewKeyDown 寻找 Alt + 另一个键时,我不得不使用 e.SystemKey 而不是 e.Key(在使用 alt+另一个字符的情况下,e.Key 的值是“System”,在我的情况)
      【解决方案4】:

      这就是我的处理方式(使用 PreviewKeyDown),假设我们正在寻找 Alt + R...

      private void OnPreviewKeyDown(object sender, KeyEventArgs e)
      {
          if ((Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt)
             && e.SystemKey == Key.R)
          {
             //do whatever
          }
      }
      

      也许有人可以弄清楚为什么我必须使用 e.SystemKey 而不仅仅是 e.Key,也许是因为修饰符?但这在搜索修饰符+键时对我来说完美无缺。

      【讨论】:

        【解决方案5】:

        部分借鉴@Josh,有点类似于@Krushik,还引用了一个关于Difference between KeyEventArgs.systemKey and KeyEventArgs.Key的问题(回答为什么Josh必须使用SystemKey);其中,使用修饰键(如 Alt)时,e.Key 返回 Key.System,因此“真实”键在 e.SystemKey 内。

        解决这个问题的方法是首先获取“真实”密钥,然后执行条件:

        private void OnPreviewKeyDown(object sender, KeyEventArgs e)
        {
            // Fetch the real key.
            var key = e.Key == Key.System ? e.SystemKey : e.Key;
        
            if ((Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt))
                && key == Key.Return)
            {
                // Execute your code.
            }
        }
        

        【讨论】:

        • 感谢您对嵌入在我的答案中的问题的回答;)我从未真正看过它,很高兴知道!
        【解决方案6】:

        还有:

        如果 My.Computer.Keyboard.ShiftKeyDown 则 ...

        My.Computer.Keyboard.CtrlKeyDown

        My.Computer.Keyboard.AltKeyDown

        【讨论】:

          猜你喜欢
          • 2019-07-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-16
          • 1970-01-01
          • 1970-01-01
          • 2010-09-13
          • 1970-01-01
          相关资源
          最近更新 更多