【问题标题】:How to tell when modifier keys are pressed/released如何判断何时按下/释放修饰键
【发布时间】:2023-03-29 04:24:01
【问题描述】:

我希望能够知道何时按下或释放修改的键(CtrlShift)。

基本上,用户可以在按下修改键的情况下执行多次击键,并且我不想在它被释放之前执行操作(想想Emacs with Ctrl + X + S).

我试图用 PreviewKeyUp 和 PreviewKeyDown 来做到这一点,但这似乎处理的是普通键而不是修饰符。一旦我在事件中,我可以判断修改键是否被按下,但我无法判断修改键是否被释放并在事件之间重新按下。

【问题讨论】:

    标签: c# wpf events modifier-key


    【解决方案1】:
    protected override void OnPreviewKeyDown(KeyEventArgs e)
    {
        // I just picked that key for a sample
        case Key.Tab:
            if (Keyboard.IsKeyDown(Key.LeftShift) ||
                Keyboard.IsKeyDown(Key.RightShift))
            {
                DoMyStuff();
            }
    
    
        // Similar things for Ctrl:
    
           if (Keyboard.IsKeyDown(Key.LeftCtrl) ||
               Keyboard.IsKeyDown(Key.RightCtrl))
            {
                ....
            }
    

    【讨论】:

      【解决方案2】:

      我刚刚意识到Key.LeftShift等的存在。所以我可以在按下时设置一个标志,并在释放键时检查该标志。

      【讨论】:

        【解决方案3】:

        最简单的方法是这样做,只要您想获得按下了哪些修饰符。

        var kb = new Microsoft.VisualBasic.Devices.Keyboard();
        
        var alt = kb.AltKeyDown;
        var ctrl = kb.CtrlKeyDown;
        var shift = kb.ShiftKeyDown;
        

        你可以用它做一个方法,这样使用起来会更容易,像这样:

        using Microsoft.VisualBasic.Devices;
        
        ...
        
        private static readonly Keyboard KEYBOARD = new Keyboard();
        
        private static Keys GetPressedModifiers()
        {
            var mods = Keys.None;
        
            if (KEYBOARD.AltKeyDown)
            {
                mods |= Keys.Alt;
            }
        
            if (KEYBOARD.CtrlKeyDown)
            {
                mods |= Keys.Control;
            }
        
            if (KEYBOARD.ShiftKeyDown)
            {
                mods |= Keys.Shift;
            }
        
            return mods;
        }
        

        【讨论】:

          【解决方案4】:

          您可以在 KeyDown 或 PreviewKeydown 事件中执行类似的操作。

          这里我只是以Shift + A为例:

          if (e.Key == Key.A && Keyboard.Modifiers == ModifierKeys.Shift)
          {
              // Do something.
          }
          

          【讨论】:

            猜你喜欢
            • 2011-08-25
            • 2012-08-02
            • 2015-03-29
            • 2010-11-02
            • 2012-05-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多