简体   繁体   中英

How can I prevent the keydown event of a form in C# from firing more than once?

According to the official documentation , the KeyDown event on a Windows Forms control occurs only once, but it is easy to demonstrate that the event fires continually aslong as a key is held down:

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

How can you consume the event so that it fires only once?

由于KeyDown的多次发生是由于Windows的keyrepeat设置,我认为你应该以某种方式跟踪该密钥的KeyUp事件,也知道该密钥已被释放。

使用KeyUp。

I'm generally a VB guy, but this seems to work for me as demo code, using the form itself as the input source:

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;
            }
        }
    }   
}

I think the logic gets a little sketchy if you're holding down multiple keys at a time, but that seems to only fire the event from the last key that was pressed anyway, so I don't think it becomes an issue.

I tested this in a TextBox in VB, and it worked fine. Wasn't sure on the inheritance conventions I should follow in c#, so I left it as a straight Form for this answer.

Apologies for any gross code formatting errors, again, this isn't my usual language.

您可以覆盖ProcessCmdKey方法。

你可以用一个柜台!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM