В одной из предыдущих статей мы рассмотрели как создать простейший
синтезатор на 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.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
-
Кнопка:
Она выглядит вот так:
-
Текстовая ссылка:
Она выглядит вот так: Как создать свой сайт
- 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 получает:
|
| KeyPress | Это событие возникает если в результате нажатия клавиши или клавиш получается символ. Например, пользователь нажимает клавиши SHIFT и строчную «a», в результате получается символ заглавной буквы «A». | KeyPress возникает после KeyDown.
|
| KeyUp | Это событие возникает, когда пользователь отпускает физическую клавишу. | Обработчик KeyUp получает:
|
См. также
- Ввод с клавиатуры в приложении 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.
