Событие нажатия клавиши windows forms

В одной из предыдущих статей мы рассмотрели как создать простейший
синтезатор на WindowsForms. На данный момент нажатие по клавишам
синтезатора возможно при помощи клика мыши.
В сегодняшней статье мы рассмотрим как использовать для этой
цели ввод с клавиатуры в C# и WindowsForms.

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

Ниже приведен полный код.

using System.Media;

namespace WinFormsApp_Piano
{
    public partial class Form1 : Form
    {

        private SoundPlayer _soundPlayer;

        public Form1()
        {
            InitializeComponent();

            // Включаем предварительное прослушивание клавиш формы
            KeyPreview = true;
        }

        # метод для обработки ввода клавиатуры
        private void MainForm_KeyDown(object sender, KeyEventArgs e)
        {
            Button buttonToClick = null;

            switch (e.KeyCode)
            {
                case Keys.Q:
                    buttonToClick = button1;
                    break;
                case Keys.W:
                    buttonToClick = button2;
                    break;
                case Keys.E:
                    buttonToClick = button3;
                    break;
                case Keys.A:
                    buttonToClick = button4;
                    break;
                case Keys.S:
                    buttonToClick = button5;
                    break;
                case Keys.D:
                    buttonToClick = button6;
                    break;
                case Keys.Z:
                    buttonToClick = button7;
                    break;
                case Keys.X:
                    buttonToClick = button8;
                    break;

                }

                 if (buttonToClick != null)
                 {
                    HighlightButton(buttonToClick);
                    buttonToClick.PerformClick();
                    }

            }

         # метод для изменения состояния клавиши
          private void HighlightButton(Button button)
        {
            // Временно меняем цвет фона кнопки
            button.BackColor = SystemColors.GrayText;

            // Создаем обработчики событий GotFocus и LostFocus для кнопки
            button.GotFocus += Button_GotFocus;
            button.LostFocus += Button_LostFocus;

            // Принудительно вызываем событие GotFocus для кнопки
            button.Focus();
        }

        # метод отслеживающий активность клавиши
        private void Button_GotFocus(object sender, EventArgs e)
        {
            // Восстанавливаем исходный цвет фона кнопки при фокусировке
            Button button = (Button)sender;
            button.BackColor = SystemColors.Control;
        }

        private void Button_LostFocus(object sender, EventArgs e)
        {
            // Восстанавливаем исходный цвет фона кнопки при потере фокуса
            Button button = (Button)sender;
            button.BackColor = SystemColors.Control;
            button.GotFocus -= Button_GotFocus;
            button.LostFocus -= Button_LostFocus;
        }

        private void PlaySound(string soundFilePath)
        {
            _soundPlayer = new SoundPlayer(soundFilePath);
            _soundPlayer.Play();
        }

        private void button1_Click_1(object sender, EventArgs e)
        {

            PlaySound(Полный путь к файлу\\zvuk-notyi-do.wav");
        }

        private void button2_Click(object sender, EventArgs e)
        {
            PlaySound("Полный путь к файлу\\zvuk-notyi-sol.wav");
        }

        private void button3_Click(object sender, EventArgs e)
        {
            PlaySound("Полный путь к файлу\\zvuk-notyi-lya.wav");
        }

        private void button4_Click(object sender, EventArgs e)
        {
            PlaySound("Полный путь к файлу\\zvuk-notyi-mi.wav");
        }

        private void button5_Click(object sender, EventArgs e)
        {
            PlaySound("Полный путь к файлу\\zvuk-notyi-si.wav");
        }

        private void button6_Click(object sender, EventArgs e)
        {
            PlaySound("Полный путь к файлу\\zvuk-notyi-re.wav");
        }

        private void button7_Click(object sender, EventArgs e)
        {
            PlaySound("Полный путь к файлу\\zvuk-notyi-fa.wav");
        }

        private void button8_Click(object sender, EventArgs e)
        {
            PlaySound("Полный путь к файлу\\zvuk-notyi-do-vo-vtoro-oktave.wav");
        }
    }

}

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

  • Создано 20.07.2023 09:58:57

  • Михаил Русаков

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так:

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Распознавание голоса и речи на C#

UnmanagedCoder 05.05.2025

Интеграция голосового управления в приложения на C# стала намного доступнее благодаря развитию специализированных библиотек и API. При этом многие разработчики до сих пор считают голосовое управление. . .

Реализация своих итераторов в C++

NullReferenced 05.05.2025

Итераторы в C++ — это абстракция, которая связывает весь экосистему Стандартной Библиотеки Шаблонов (STL) в единое целое, позволяя алгоритмам работать с разнородными структурами данных без знания их. . .

Разработка собственного фреймворка для тестирования в C#

UnmanagedCoder 04.05.2025

C# довольно богат готовыми решениями – NUnit, xUnit, MSTest уже давно стали своеобразными динозаврами индустрии. Однако, как и любой динозавр, они не всегда могут протиснуться в узкие коридоры. . .

Распределенная трассировка в Java с помощью OpenTelemetry

Javaican 04.05.2025

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

Шаблоны обнаружения сервисов в Kubernetes

Mr. Docker 04.05.2025

Современные Kubernetes-инфраструктуры сталкиваются с серьёзными вызовами. Развертывание в нескольких регионах и облаках одновременно, необходимость обеспечения низкой задержки для глобально. . .

Создаем SPA на C# и Blazor

stackOverflow 04.05.2025

Мир веб-разработки за последние десять лет претерпел коллосальные изменения. Переход от традиционных многостраничных сайтов к одностраничным приложениям (Single Page Applications, SPA) — это. . .

Реализация шаблонов проектирования GoF на C++

NullReferenced 04.05.2025

«Банда четырёх» (Gang of Four или GoF) — Эрих Гамма, Ричард Хелм, Ральф Джонсон и Джон Влиссидес — в 1994 году сформировали канон шаблонов, который выдержал проверку временем. И хотя C++ претерпел. . .

C# и сети: Сокеты, gRPC и SignalR

UnmanagedCoder 04.05.2025

Сетевые технологии не стоят на месте, а вместе с ними эволюционируют и инструменты разработки. В . NET появилось множество решений — от низкоуровневых сокетов, позволяющих управлять каждым байтом. . .

Создание микросервисов с Domain-Driven Design

ArchitectMsa 04.05.2025

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

Многопоточность в C++: Современные техники C++26

bytestream 04.05.2025

C++ долго жил по принципу «один поток — одна задача» — как старательный солдатик, выполняющий команды одну за другой. В то время, когда процессоры уже обзавелись несколькими ядрами, этот подход стал. . .

Использование событий клавиатуры

В большинстве программ Windows Forms для обработки ввода с клавиатуры используются события клавиатуры. В этом разделе содержится обзор событий клавиатуры, включая сведения об использовании каждого события и данные, которые предоставляются для каждого события. Также см. в разделе Обзор обработчиков событий (Windows Forms) и Общие сведения о событиях (Windows Forms).

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

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

  • Событие KeyDown возникает один раз

  • Событие KeyPress, которое может встречаться несколько раз, если пользователь удерживает нажатую клавишу.

  • Событие KeyUp возникает один раз при отпускании клавиши.

Когда пользователь нажимает клавишу, Windows Forms определяет, какое событие вызвать в зависимости от того, на что указывает сообщение клавиатуры — на клавишу с символом или на физическую клавишу. Дополнительные сведения о символьных и физических клавишах см. в разделе принцип работы ввода с клавиатуры.

В следующей таблице описаны указанные три метода.

События клавиатуры Описание Результаты
KeyDown Это событие возникает, когда пользователь нажимает физическую клавишу. Обработчик KeyDown получает:

  • Параметр KeyEventArgs, который предоставляет свойство KeyCode (указывающее на физическую клавишу клавиатуры).
  • Свойство Modifiers (SHIFT, CTRL или ALT).
  • Свойство KeyData (которое объединяет код клавиши и модификатор). Параметр KeyEventArgs также предоставляет:
    • Свойство Handled, которое может быть задано для предотвращения получения кода клавиши базовым элементом управления.
    • Свойство SuppressKeyPress, которое может использоваться для подавления событий KeyPress и KeyUp для данного нажатия клавиши.
KeyPress Это событие возникает если в результате нажатия клавиши или клавиш получается символ. Например, пользователь нажимает клавиши SHIFT и строчную «a», в результате получается символ заглавной буквы «A». KeyPress возникает после KeyDown.

  • Обработчик KeyPress получает:
  • Параметр KeyPressEventArgs, который содержит код символа нажатой клавиши. Этот код является уникальным для каждой комбинации клавиш символа и модификатора.

    Например клавиша «A» создаст

    • код символа 65, если она нажата при нажатой клавише «SHIFT»
    • Или клавиша CAPS LOCK вернет код 97, если она нажата сама по себе,
    • И код 1, если она нажата совместно с клавишей CTRL.
KeyUp Это событие возникает, когда пользователь отпускает физическую клавишу. Обработчик KeyUp получает:

  • Параметр KeyEventArgs,
    • который предоставляет свойство KeyCode (указывающее на физическую клавишу клавиатуры).
    • Свойство Modifiers (SHIFT, CTRL или ALT).
    • Свойство KeyData (которое объединяет код клавиши и модификатор).

См. также

  • Ввод с клавиатуры в приложении Windows Forms
  • Принцип работы ввод с клавиатуры
  • Ввод данных мышью в приложении Windows Forms

When developing applications in C#, it is often necessary to handle keyboard input events to allow users to interact with the program effectively. In this blog post, we will explore how to capture and respond to keyboard input events in C#.

Capturing Keyboard Input

C# provides various ways to capture keyboard input events. One common approach is to use the KeyDown event provided by the Form class. This event occurs when a key is pressed while the form has focus. Here is an example of how you can subscribe to the KeyDown event:

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        // Handle Enter key press
    }
}

In the above code snippet, we are handling the Enter key press event. You can check for different key codes based on your requirements.

Responding to Keyboard Input

Once you have captured the keyboard input, you can respond to it by performing specific actions in your application. For example, you can update the UI, trigger functions, or navigate between different elements based on the key pressed by the user.

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Left)
    {
        // Move the object to the left
    }
    else if (e.KeyCode == Keys.Right)
    {
        // Move the object to the right
    }
}

In the above code snippet, we are responding to the Left and Right arrow key presses by moving an object in the UI accordingly.

Conclusion

Handling keyboard input events is essential for creating interactive and user-friendly applications in C#. By capturing and responding to keyboard input, you can enhance the user experience and make your application more dynamic. Experiment with different key events and actions to create a seamless interaction flow for your users.

Start implementing keyboard input event handling in your C# applications today and take your programming skills to the next level!

Pressing of a key is detected and handled in Windows Form using KeyPress, KeyDown or similar events.

this.KeyDown += myForm_KeyDown;

private void myForm_KeyDown(object sender, KeyEventArgs e)
{
   //Your code here
}

But these events does not fire when arrow keys are pressed. One way to get around it is to set KeyPreview as true for your Form. In many cases, this also doesn’t work, for instance, when you have buttons on your Form.

In such cases, ProcessCmdKey can be overridden to detect and handle arrow key events.

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
       switch(keyData)
       {
           case Keys.Down:
               //Handle down arrow key event
               break;
           case Keys.Up:
               //Handle up arrow key event
               break;
           case Keys.Right:
               //Handle right arrow key event
               break;
           case Keys.Left:
               //Handle left arrow key event
               break;
        }
        return base.ProcessCmdKey(ref msg, keyData);
}

After handling the arrow key event if you do not want the standard arrow key functionality to kick in, return true rather than calling return base.ProcessCmdKey(ref msg, keyData); Standard functionality could be to move focus to the next or previous control.

Returning true from ProcessCmdKey means event has been handled and should not be routed further for processing.

Понравилась статья? Поделить с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
  • Die hard trilogy windows 10
  • Смена типа сети в windows 10 powershell
  • Перевести из windows 1251 в utf 8
  • Windows server 2012 дата выхода
  • Apps emulator for windows