【问题标题】:KeyDown and keyUp event to avoid repeat letter in textbox controlKeyDown 和 keyUp 事件以避免文本框控件中的重复字母
【发布时间】:2011-03-06 21:58:34
【问题描述】:

我的问题是:

如何使用 C# 在文本框控件中禁用按住键? 例如 Boxxxxxxxxxxxxxxxxxxxxx

我不想让用户重复键盘上的任何字符。

有什么建议吗?

谢谢

【问题讨论】:

    标签: c#


    【解决方案1】:

    对于使用 KeyDown 和 KeyUp 事件来抑制按键重复的每个人来说,这是一个额外的注意事项。如果你这样做,你需要排除捕获元键,如 Alt/Shift 等,否则当这些键被按住时,你想要的实际键将不会被发送,因为这是一个两个键组合,并且 KeyDown 和 KeyUp 事件会捕获所有键。

    这适用于所有两键组合。 我没有将所有元键添加到以下示例中,只是最常见的。 您可以通过将它们添加到集合中来轻松添加自己的密钥。 扩展 BFree 的帖子:

    public partial class Form1 : Form
    {
        private static readonly System.Collections.Generic.ICollection<System.Windows.Forms.Keys) ExcludeKeys = new System.Collections.Generic.HashSet<System.Windows.Forms.Keys)()
        {
            System.Windows.Forms.Keys.None,
            System.Windows.Forms.Keys.Shift,
            System.Windows.Forms.Keys.ShiftKey,
            System.Windows.Forms.Keys.LShiftKey,
            System.Windows.Forms.Keys.RShiftKey,
            System.Windows.Forms.Keys.Alt,
            System.Windows.Forms.Keys.Control,
            System.Windows.Forms.Keys.ControlKey,
            System.Windows.Forms.Keys.LControlKey,
            System.Windows.Forms.Keys.RControlKey,
            System.Windows.Forms.Keys.CapsLock,
            System.Windows.Forms.Keys.NumLock,
            System.Windows.Forms.Keys.LWin,
            System.Windows.Forms.Keys.RWin
        }
    
        private bool isKeyPressed = false;
        public Form1()
        {
            InitializeComponent();
            this.textBox1.KeyDown += new KeyEventHandler(textBox1_KeyDown);
            this.textBox1.KeyUp += new KeyEventHandler(textBox1_KeyUp);
        }
    
        void textBox1_KeyUp(object sender, KeyEventArgs e)
        {
            if (!ExcludeKeys.Contains(e.KeyCode))
            {
                isKeyPressed = false;
            }
        }
    
        void textBox1_KeyDown(object sender, KeyEventArgs e)
        {
            if (!ExcludeKeys.Contains(e.KeyCode))
            {
                e.SuppressKeyPress = isKeyPressed;
                isKeyPressed = true;
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      您可以在 KeyEventArgs 上使用 SupressKeyPress 属性:

      public partial class Form1 : Form
      {
          private bool isKeyPressed = false;
          public Form1()
          {
              InitializeComponent();
              this.textBox1.KeyDown += new KeyEventHandler(textBox1_KeyDown);
              this.textBox1.KeyUp += new KeyEventHandler(textBox1_KeyUp);
          }
      
          void textBox1_KeyUp(object sender, KeyEventArgs e)
          {
              isKeyPressed = false;
          }
      
          void textBox1_KeyDown(object sender, KeyEventArgs e)
          {
              e.SuppressKeyPress = isKeyPressed;
              isKeyPressed = true;
          }
      
      
      }
      

      【讨论】:

        【解决方案3】:
        bool prevent = false;
        private void textBox1_KeyDown(object sender, KeyEventArgs e)
        {
            e.SuppressKeyPress = prevent;
        }
        
        private void textBox1_KeyUp(object sender, KeyEventArgs e)
        {
            prevent = false;
        }
        
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            prevent = true;
        }
        

        【讨论】:

          【解决方案4】:

          我不熟悉 c# 中的细节,但我想像这样:

          while (keyIsDown){
          //do nothing
          }
          

          会起作用的。如果没有办法跟踪按下的键,我会感到惊讶。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-07-21
            • 1970-01-01
            • 2014-06-12
            • 1970-01-01
            相关资源
            最近更新 更多