Как я могу предотвратить запуск события keydown формы в C # более одного раза? - PullRequest
3 голосов
/ 28 апреля 2009

Согласно официальной документации событие KeyDown в элементе управления Windows Forms происходит только один раз, но легко показать, что событие происходит непрерывно, пока нажата клавиша:

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

Как вы можете поглотить событие, чтобы оно срабатывало только один раз?

Ответы [ 5 ]

2 голосов
/ 28 апреля 2009

Я, как правило, парень 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;
            }
        }
    }   
}

Я думаю, что логика становится немного схематичной, если вы одновременно удерживаете несколько клавиш, но, похоже, это вызывает событие только с последней нажатой клавиши, так что я не думаю, что это становится проблемой .

Я проверял это в TextBox в VB, и он работал нормально. Я не был уверен в соглашениях о наследовании, которым я должен следовать в c #, поэтому я оставил его в виде прямой формы для этого ответа.

Извиняюсь за грубые ошибки форматирования кода, опять же, это не мой обычный язык.

2 голосов
/ 28 апреля 2009

Использовать KeyUp.

2 голосов
/ 28 апреля 2009

, поскольку многократное вхождение KeyDown связано с настройками повторения клавиш в Windows, я думаю, что вам следует каким-то образом отслеживать событие KeyUp этого ключа, чтобы знать, что ключ был освобожден.

0 голосов
/ 28 апреля 2009

Вы можете использовать счетчик!

0 голосов
/ 28 апреля 2009

Вы можете переопределить метод ProcessCmdKey.

...