Базовая обработка событий WinForm KeyDown - PullRequest
2 голосов
/ 23 ноября 2010

Я использую WinForms.Я создал обработчик события для KeyDown основной формы, вызывая тем самым обработчик события Click кнопки.

Вызванный обработчик события Click зависит от конкретной нажатой клавиши.Если пользователь нажимает кнопку вместо того, чтобы использовать клавишу, а затем впоследствии пытается использовать клавишу, клавиша (например, стрелка вниз) действует как цикл табуляции, изменяя фокус между каждым элементом управления кнопки в форме (вместо выполненияобработчик Keydown).

Есть идеи?

Ответы [ 4 ]

2 голосов
/ 02 декабря 2010

Как и в случае с SimpleCoder, мне пришлось переопределить член IsInputKey для класса Button.

public class ControlButton : Button
{
    protected override bool IsInputKey(Keys keyData)
    {
        if (keyData == Keys.Up)
        {
            return true;
        }
        else if (keyData == Keys.Down)
        {
            return true;
        }
        else if (keyData == Keys.Left)
        {
            return true;
        }
        else if (keyData == Keys.Right)
        {
            return true;
        }
        else
        {
            return base.IsInputKey(keyData);
        }
    }
}

Затем мне нужно было создать экземпляр объекта моей кнопки (в классе конструктора), используя этот новый класс, напримерИтак:

    private ControlButton btnDown;
    private ControlButton btnRight;
    private ControlButton btnLeft;
    private ControlButton btnUp;

    this.btnDown = new ControlButton();
    this.btnRight = new ControlButton();
    this.btnUp = new ControlButton();
    this.btnLeft = new ControlButton();

Далее я зарегистрировал OnClick обработчики для каждого из новых объектов кнопки, например так:

    this.btnUp.Click += new System.EventHandler(this.btnUp_Click);

    private void btnUp_Click(object sender, EventArgs e)
    {            
        MessageBox.Show("Up");
    }

(и т. д.)

И зарегистрировалKeyDown обработчик для главной формы:

    this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.frmUavController_KeyDown);

    private void frmUavController_KeyDown(object sender, KeyEventArgs e)
    {
        if ((e.KeyCode == Keys.Up) || (e.KeyCode == Keys.W))
        {
            btnUp.PerformClick();
        }
        else if ((e.KeyCode == Keys.Down) || (e.KeyCode == Keys.S))
        {
            btnDown.PerformClick();
        }
        else if ((e.KeyCode == Keys.Left) || (e.KeyCode == Keys.A))
        {
            btnLeft.PerformClick();
        }
        else if ((e.KeyCode == Keys.Right) || (e.KeyCode == Keys.D))
        {
            btnRight.PerformClick();
        }
    }

Установив для свойства главной формы KeyPreview значение true и увидев, что я переопределил поведение по умолчанию клавиш Up, Down, Left и Right, кнопка управления больше не переключает фокусировку, а возвращает true, возвращая управление обратно в основную форму.Отсюда, если нажимаются последующие клавиши (вверх, вниз, влево или вправо), форма воздействует на соответствующий обработчик.

2 голосов
/ 02 декабря 2010

Проблема заключается в том, что кнопка имеет фокус при нажатии, поэтому последующие нажатия клавиш фиксируются не самой формой, а кнопками. В обработчике события click для кнопок сфокусируйте форму:

this.Focus();

Таким образом, фокус восстанавливается в форме, поэтому форма будет прослушивать события нажатия клавиш.

Редактировать

Реальная проблема, как вы обнаружили, заключается в том, что клавиши со стрелками не рассматриваются как клавиши ввода. Чтобы это исправить, вам нужно создать новый класс, который наследует любой элемент управления, который вы хотите использовать. Затем вы переопределяете метод IsInputKey, чтобы рассматривать клавиши со стрелками как клавиши ввода. Проверьте эту ссылку: http://bytes.com/topic/c-sharp/answers/517530-trapping-arrow-keys-usercontrol. Эта статья также полезна: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.isinputkey.aspx.

0 голосов
/ 23 ноября 2010

Посмотрите на свойство KeyPreview.http://msdn.microsoft.com/en-us/library/system.windows.forms.form.keypreview.aspx

Установите его на true.

. Или же вы можете переопределить ProcessKeyPreview формы.

0 голосов
/ 23 ноября 2010

Используйте Control.GetNextControl и установите Фокус на то, что он возвращает.

...