🎨 Графическое программирование на C#

← Вернуться к модулю 4

Урок 4.2: События клавиатуры

Модуль 4 ⏱️ ~1.5 часа

📌 Ключевые моменты этого урока:

  • 3 события: KeyDown (клавиша нажата), KeyUp (отпущена), KeyPress (символ набран)
  • KeyDown/KeyUp - для навигации и команд; KeyPress - для текстового ввода
  • e.KeyCode используется в KeyDown/KeyUp; e.KeyChar в KeyPress
  • Модификаторы (Ctrl, Shift, Alt) проверяются через e.Control, e.Shift, e.Alt
  • Не используйте KeyPress для стрелок/функциональных клавиш - используйте KeyDown

KeyDown, KeyUp, KeyPress

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    // Клавиша нажата
    if (e.KeyCode == Keys.Left)
    {
        x -= 10;
        this.Invalidate();
    }
}

private void Form1_KeyUp(object sender, KeyEventArgs e)
{
    // Клавиша отпущена
}

private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
    // Символ набран (только для печатных символов)
    if (e.KeyChar == 'a')
    {
        // Действие
    }
}

KeyEventArgs

  • KeyCode — код клавиши (Keys.Left, Keys.A, etc.)
  • KeyData — полная информация о клавише
  • Modifiers — модификаторы (Ctrl, Shift, Alt)
  • Handled — обработано ли событие

Модификаторы (Ctrl, Shift, Alt)

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    // Проверка модификаторов
    if (e.Control && e.KeyCode == Keys.S)
    {
        // Ctrl+S - сохранить
        SaveFile();
    }
    
    if (e.Shift && e.KeyCode == Keys.Delete)
    {
        // Shift+Delete
    }
    
    if (e.Alt && e.KeyCode == Keys.F4)
    {
        // Alt+F4
    }
}

Практика: управление с клавиатуры

private int x = 100, y = 100;

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    int step = e.Shift ? 20 : 10; // Shift = быстрее
    
    switch (e.KeyCode)
    {
        case Keys.Left:
        case Keys.A:
            x -= step;
            break;
        case Keys.Right:
        case Keys.D:
            x += step;
            break;
        case Keys.Up:
        case Keys.W:
            y -= step;
            break;
        case Keys.Down:
        case Keys.S:
            y += step;
            break;
    }
    
    this.Invalidate();
}

// Важно: установите KeyPreview = true для формы
this.KeyPreview = true;

Практическое задание

Задание: Управление с клавиатуры

  1. Создайте игру, где объект управляется стрелками или WASD
  2. Добавьте ускорение при удержании Shift
  3. Реализуйте обработку комбинаций клавиш (Ctrl+S для сохранения)

Проверка знаний

Ответьте на вопросы, чтобы проверить, насколько хорошо вы усвоили материал:

1. Какое событие возникает при нажатии клавиши?
  • KeyPress
  • KeyUp
  • KeyDown
  • KeyEnter
2. Как проверить, нажата ли клавиша Ctrl?
  • e.Key == Keys.Control
  • e.Control
  • e.Modifiers == Keys.Control
  • Control.IsPressed
3. Как проверить, нажата ли клавиша Ctrl?
  • e.Control в KeyEventArgs
  • e.CtrlKey
  • e.Key == Keys.Control
  • Control.IsPressed()