【问题标题】:Detect if Modifier Key is Pressed in KeyRoutedEventArgs Event检测是否在 KeyRoutedEventArgs 事件中按下了修饰键
【发布时间】:2012-10-11 15:50:04
【问题描述】:

我有以下代码:

public void tbSpeed_KeyDown(object sender, KeyRoutedEventArgs e)
{
    e.Handled = !((e.Key >= 48 && e.Key <= 57) || (e.Key >= 96 && e.Key <= 105) || (e.Key == 109) || (e.Key == 189));
}

有什么方法可以检测是否按下了像 shift 这样的修饰键?

【问题讨论】:

    标签: c# .net xaml uwp windows-runtime


    【解决方案1】:

    使用GetKeyState。例如

    var state = CoreWindow.GetForCurrentThread().GetKeyState(VirtualKey.Shift);
    return (state & CoreVirtualKeyStates.Down) == CoreVirtualKeyStates.Down;
    

    注意:对于 Alt,您将使用 VirtualKey.Menu。

    【讨论】:

      【解决方案2】:

      对于 Win10 UWP,我注意到 CTRL 和 SHIFT 键设置为锁定状态。所以我做了以下事情:

      var shiftState = CoreWindow.GetForCurrentThread().GetKeyState(VirtualKey.Shift);
      var ctrlState = CoreWindow.GetForCurrentThread().GetKeyState(VirtualKey.Control);
      
      var isShiftDown = shiftState != CoreVirtualKeyStates.None;
      var isCtrlDown = ctrlState != CoreVirtualKeyStates.None;
      

      【讨论】:

      • 实际上使用HasFlag 方法会更好——CoreWindow.GetForCurrentThread().GetKeyState(VirtualKey.Shift).HasFlag( CoreVirtualKeyStates.Down )——因为这样可以避免键只被锁定而没有被实际按下的情况。
      【解决方案3】:

      你可以试试下面的代码

      CoreVirtualKeyStates controlKeyState = Window.Current.CoreWindow.GetKeyState(VirtualKey.Control);
      var  ctrl = (controlKeyState & CoreVirtualKeyStates.Down) == CoreVirtualKeyStates.Down;
      
      CoreVirtualKeyStates shiftKeyState = Window.Current.CoreWindow.GetKeyState(VirtualKey.Shift);
      var shift = (shiftKeyState & CoreVirtualKeyStates.Down) == CoreVirtualKeyStates.Down;
      

      【讨论】:

        【解决方案4】:

        Bitwise AND 带有Shift 键的键盘的Modifiers 属性-

        bool isShiftKeyPressed = (Keyboard.Modifiers & ModifierKeys.Shift)
                                 == ModifierKeys.Shift;
        

        也试试这个-

        bool isShiftKeyPressed = (ModifierKeys & Keys.Shift) == Keys.Shift;
        

        Control.ModifierKeys == Keys.Shift
        

        【讨论】:

        • 我讨厌那些含糊不清的 cmets。 @Elmo 应该说的是,除了 Keyboard 类在 UWP 下不可用之外,该代码非常好。
        猜你喜欢
        • 1970-01-01
        • 2011-08-01
        • 2017-05-25
        • 1970-01-01
        • 1970-01-01
        • 2015-01-21
        • 2012-02-05
        • 2014-03-31
        • 1970-01-01
        相关资源
        最近更新 更多