代码之家  ›  专栏  ›  技术社区  ›  Jannie Theunissen

如何防止C中窗体的键控事件触发多次?

  •  3
  • Jannie Theunissen  · 技术社区  · 15 年前

    根据 official documentation ,Windows窗体控件上的key down事件只发生一次,但很容易证明只要按住某个键,该事件就会持续激发:

        private void textBox1_KeyDown(object sender, KeyEventArgs e)
        {
            label1.Text = string.Format("{0}", globalCounter++);
        }
    

    如何使用事件,使其仅触发一次?

    5 回复  |  直到 15 年前
        1
  •  2
  •   Frosty840    15 年前

    我通常是一个vb用户,但这对我来说似乎是一个演示代码,使用表单本身作为输入源:

    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            private bool _keyHeld;
            public Form1()
            {
                InitializeComponent();
                this.KeyUp += new KeyEventHandler(Form1_KeyUp);
                this.KeyDown += new KeyEventHandler(Form1_KeyDown);
                this._keyHeld = false;
            }
    
            void Form1_KeyUp(object sender, KeyEventArgs e)
            {
                this._keyHeld = false;
            }
    
            void Form1_KeyDown(object sender, KeyEventArgs e)
            {
                if (!this._keyHeld)
                {
                    this._keyHeld = true;
                    if (this.BackColor == Control.DefaultBackColor)
                    {
                        this.BackColor = Color.Red;
                    }
                    else
                    {
                        this.BackColor = Control.DefaultBackColor;
                    }
                }
                else
                {
                    e.Handled = true;
                }
            }
        }   
    }
    

    我认为如果你一次按下多个键,逻辑会变得有点粗略,但这似乎只会从最后一个按键触发事件,所以我不认为这会成为一个问题。

    我在vb的文本框中测试了这个,它运行得很好。对于继承约定,我不确定应该在C中遵循什么,所以我把它作为这个答案的直接形式。

    对于任何严重的代码格式错误,再次道歉,这不是我通常使用的语言。

        2
  •  2
  •   pomarc    15 年前

    由于keydown的多个来源是由于windows的keyprepeat设置,我认为您应该以某种方式跟踪该键的keypup事件,以了解该键已被释放。

        3
  •  2
  •   stevehipwell    15 年前

    使用KEYUP。

        4
  •  0
  •   TcKs    15 年前

    可以重写processCmdKey方法。

        5
  •  0
  •   Rigobert Song    15 年前

    你可以用计数器!