Как получить нажатие клавиш в c # winforms, если ничего не выделено - PullRequest
0 голосов
/ 29 мая 2018

У меня есть контроллер, который вы можете перемещать с помощью мышки.

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

что у меня есть:

    private void project1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Up)
        {
            MoveUp();
        }

        if (e.KeyCode == Keys.Down)
        {
            MoveDown();
        }

        if (e.KeyCode == Keys.Left)
        {
            MoveLeft();
        }

        if (e.KeyCode == Keys.Right)
        {
            MoveRight();
        }
    }

    private void project1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
    {
        switch (e.KeyCode)
        {
            case Keys.Down:
            case Keys.Up:
            case Keys.Left:
            case Keys.Right:
                e.IsInputKey = true;
                break;
        }
    }

MoveDirection () - Методы работают нормально, потому что они одинаковы, когда я нажимаю кнопку мыши.

Но я не могу заставить его работать с клавишами со стрелками - или любыми клавишами (я тоже пробовал WASD для развлечения, но он не работает - ничего не происходит!)

Что я делаюнеправильно?

Извините, если это нубистский вопрос, я все еще учусь c #:)

1 Ответ

0 голосов
/ 29 мая 2018

вы должны использовать переопределенный метод ProcessCmdKey для захвата стрелок

Этот ProcessCmdKey вызывается во время предварительной обработки сообщения для обработки командных клавиш, а также только тогда, когда элемент управления размещен в приложении Windows Forms

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    //capture up arrow key
    if (keyData == Keys.Up )
    {
        MessageBox.Show("You pressed Up arrow key");
        return true;
    }
    //capture down arrow key
    if (keyData == Keys.Down )
    {
        MessageBox.Show("You pressed Down arrow key");
        return true;
    }
    //capture left arrow key
    if (keyData == Keys.Left)
    {
        MessageBox.Show("You pressed Left arrow key");
        return true;
    }
    //capture right arrow key
    if (keyData == Keys.Right )
    {
        MessageBox.Show("You pressed Right arrow key");
        return true;
    }
    return base.ProcessCmdKey(ref msg, keyData);
}

вам необходимо установить для свойства Form KeyPreview значение true.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...