C#, пытающийся получать событие KeyDown на форме

Использование Вашего кода:

console.log(arr[1]);  // prints: abc
console.log(arr[0]);  // prints:  format_abc

Редактирование: Safari 3, если это имеет значение.

25
задан Patrick 19 August 2009 в 10:13
поделиться

4 ответа


Переопределить поведение IsInputKey


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

Класс ниже создает настраиваемую кнопку, которая переопределяет метод IsInputKey , так что клавиша со стрелкой вправо не рассматривается как специальный ключ. . Оттуда вы можете легко сделать это для других клавиш со стрелками или чего-то еще.

    public partial class MyButton : Button
    {
        protected override bool IsInputKey(Keys keyData)
        {
            if (keyData == Keys.Right)
            {
                return true;
            }
            else
            {
                return base.IsInputKey(keyData);
            }
        }
    }

После этого вы можете обрабатывать событие события keyDown в каждой отдельной кнопке или в самой форме:

В методе KeyDown кнопок попробуйте установить эти свойства:

private void myButton1_KeyDown(object sender, KeyEventArgs e)
{
  e.Handled = true;
  //DoSomething();
}

- OR -

обрабатывают общее поведение в форме: (не устанавливайте e.Handled = true; в кнопках)

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    //DoSomething();
}
17
ответ дан 28 November 2019 в 18:08
поделиться

Установлено ли для свойства KeyPreview формы значение true ? Это заставит форму «сначала взглянуть» на ключевые события.

Обновление: заставить это работать правильно, когда кнопка находится в фокусе, кажется немного сложным. Элемент управления Button перехватывает нажатия клавиш со стрелками и перемещает фокус на следующий или предыдущий элемент управления в порядке табуляции таким образом, что KeyDown , KeyUp и KeyPress события не поднимаются. Однако возникает событие PreviewKeyDown , поэтому его можно использовать:

private void Form_KeyDown(object sender, KeyEventArgs e)
{
    e.Handled = ProcessKeyDown(e.KeyCode);
}

// event handler for the PreViewKeyDown event for the buttons
private void ArrowButton_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
    ProcessKeyDown(e.KeyCode);

}

private bool ProcessKeyDown(Keys keyCode)
{
    switch (keyCode)
    {
        case Keys.Up:
            {
                // act on up arrow
                return true;
            }
        case Keys.Down:
            {
                // act on down arrow
                return true;
            }
        case Keys.Left:
            {
                // act on left arrow
                return true;
            }
        case Keys.Right:
            {
                // act on right arrow
                return true;
            }
    }
    return false;
}

Тем не менее, фокус перемещается довольно некрасиво ...

29
ответ дан 28 November 2019 в 18:08
поделиться
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        KeyPreview = true;
        KeyDown += new KeyEventHandler(Form1_KeyDown);
    }

    void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        System.Diagnostics.Debug.Write(e.KeyCode);
    }
}
7
ответ дан 28 November 2019 в 18:08
поделиться

Я считаю, что самый простой способ решить эту проблему - переопределить метод ProcessCmdKey () формы. Таким образом, ваша логика обработки ключей будет выполняться независимо от того, какой элемент управления находится в фокусе во время нажатия клавиши.Кроме того, вы даже можете выбрать, получит ли сфокусированный элемент управления ключ после его обработки (вернуть false) или нет (вернуть true).
Ваш маленький игровой пример можно переписать так:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if (keyData == Keys.Left)
    {
        MoveLeft(); DrawGame(); DoWhatever();
        return true; //for the active control to see the keypress, return false
    }
    else if (keyData == Keys.Right)
    {
        MoveRight(); DrawGame(); DoWhatever();
        return true; //for the active control to see the keypress, return false
    }
    else if (keyData == Keys.Up)
    {
        MoveUp(); DrawGame(); DoWhatever();
        return true; //for the active control to see the keypress, return false
    }
    else if (keyData == Keys.Down)
    {
        MoveDown(); DrawGame(); DoWhatever();
        return true; //for the active control to see the keypress, return false
    }
    else
        return base.ProcessCmdKey(ref msg, keyData);
}
17
ответ дан 28 November 2019 в 18:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: