【问题标题】:Capture multiple key downs in C#在 C# 中捕获多个按键
【发布时间】:2009-04-02 12:36:45
【问题描述】:

在使用Windows Forms 表单时,如何在 C# 中捕获多个按键?

我似乎无法同时获得向上箭头和向右箭头。

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    我认为你最好使用 GetKeyboardState API 函数。

    [DllImport ("user32.dll")]
    public static extern int GetKeyboardState( byte[] keystate );
    
    
    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
       byte[] keys = new byte[256];
    
       GetKeyboardState (keys);
    
       if ((keys[(int)Keys.Up] & keys[(int)Keys.Right] & 128 ) == 128)
       {
           Console.WriteLine ("Up Arrow key and Right Arrow key down.");
       }
    }
    

    在 KeyDown 事件中,您只需询问键盘的“状态”。 GetKeyboardState 将填充您提供的字节数组,该数组中的每个元素都代表一个键的状态。

    您可以通过使用每个虚拟键代码的数值来访问每个键状态。当该键的字节设置为 129 或 128 时,表示该键已按下(按下)。如果该键的值为 1 或 0,则该键向上(未按下)。值 1 表示切换键状态(例如,大写锁定状态)。

    详情请见Microsoft documentation for GetKeyboardState

    【讨论】:

      【解决方案2】:

      为您提供一点概念验证代码,假设 Form1 包含 label1

      private List<Keys> pressedKeys = new List<Keys>();
      
      private void Form1_KeyDown(object sender, KeyEventArgs e)
      {
          pressedKeys.Add(e.KeyCode);
      
          printPressedKeys();
      }
      
      private void Form1_KeyUp(object sender, KeyEventArgs e)
      {
          pressedKeys.Remove(e.KeyCode);
      
          printPressedKeys();
      }
      
      private void printPressedKeys()
      {
          label1.Text = string.Empty;
          foreach (var key in pressedKeys)
          {
              label1.Text += key.ToString() + Environment.NewLine;
          }
      }
      

      【讨论】:

      【解决方案3】:

      Keyboard.IsKeyDown(Key.YourKey) 
      

      您可以处理多个按键操作。

      【讨论】:

      • 您好,您能详细说明一下 Keyboard 来自哪个库吗?
      • System.Windows.Input.KeyBoard
      • 非常适合 WPF。 (从汇编上讲,它来自 PresentationCore.dll)
      【解决方案4】:

      嗯,每个按键都有单独的事件吗?

      您可以为每个箭头创建四个布尔值。当它被按下时,将该箭头的布尔值设置为 true。如果释放被触发,则将该箭头的布尔值设置为 false。

      然后您可以检查 up 和 right 布尔值是否为真,然后执行您的操作。

      【讨论】:

        【解决方案5】:

        有一个托管库MouseKeyHook as NuGet,它为您提供了一个方便的托管包装器。 Source code on GitHub.

        最近添加了对检测快捷键、组合键和序列的支持。下面是一个处理箭头的用法示例:

        Hook.AppEvents().OnCombination(new Dictionary<Combination, Action>
        {
            {Combination.FromString("Left"), GoWest},
            {Combination.FromString("Left+Up"), GoNorthWest},
            {Combination.FromString("Up+Left"), GoNorthWest},
            {Combination.FromString("Up"), GoNorth},
            {Combination.FromString("Up+Right"), GoNorthEast},
            {Combination.FromString("Right+Up"), GoNorthEast},
        });
        

        欲了解更多信息,请参阅:Detecting Key Combinations and Sequences

        【讨论】:

          【解决方案6】:

          使用 SPY++ 查看按键是如何触发的。基本上,如果同时按住多个箭头键,第一个被击中的键将触发事件,然后当第二个键被击中时,它将开始触发,您将不​​再看到第一个键的事件。当他们被释放时,你会看到他们的关键事件。我建议您实现之前建议的 bool 标志,它既快速又简单。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-05-12
            • 1970-01-01
            • 1970-01-01
            • 2012-12-07
            相关资源
            最近更新 更多