Звук при нажатии горячих клавиш

264
02 мая 2017, 03:52

Создал сочетание клавиш Ctrl+O и Ctrl+А. При нажатии все работает, как я хотел, но проигрывается стандартный звук «Восклицание». Откуда он берется и как его устранить?

Я заметил что при запуске формы у меня в фокусе текстбокс. И если сделать его неактивным звук пропадает.

Answer 1

TextBox - наиболее часто используемый элемент WinForms, прямую конкуренцию может составить только Label. И именно в нем есть досадный баг, который исправили только в .NET 4.6.1

Почти все контролы, когда они находятся в фокусе, перехватывают на себя обработку нажатий на клавиши и передают событие родительскому контейнеру, только если это явно указать в обработчике. В TextBox по-умолчанию определено много горячих клавиш для работы именно с ним, но если он находится в режиме MultyLine, то большинство сочетаний клавиш Ctrl+some key работают некорректно. Если быть точным, то единственное что отрабатывает для этих сочетаний - это проигрывание системного звука "Восклицание" (не помню как он называется в английской версии), который обычно сигнализирует об ошибочном действии пользователя (например при клике в основное окно приложения, при открытом модальном диалоге).

Решений два, радикальное и "костыль".

Радикальное решение - пересобрать проект на платформе .NET 4.6.1.

Для случаев, когда повышение версии платформы не допустимо, придется исправлять баг своими силами. Для этого вешаем обработчик на событие TextBox.KeyDown, в котором прописываем необходимые нам сочетания клавиш следующим образом (для примера Ctrl+A):

private void textBox1_KeyDown(object sender, KeyEventArgs e) 
{
    if (e.KeyData == (Keys.Control | Keys.A)) 
    {
        textBox1.SelectAll();
        //убираем звуковое сопровождение при нажатии клавиш
        e.Handled = e.SuppressKeyPress = true;
    }
}

Отдельно замечу, что нельзя использовать для отключения звуков вариант:

private void textBox1_KeyDown(object sender, KeyEventArgs e) 
{
    e.Handled = e.SuppressKeyPress = true;
}

Так как это не только заглушит звуки, но и превратит TextBox в тыкву, отключив обработку клавиш полностью.

READ ALSO
Делать ссылки кликабельными в тексте

Делать ссылки кликабельными в тексте

Использую ListView для отображения логовИногда в логе бывают ссылки (напимер, "Некорректная ссылка: http://example

320
Рекурсия. Как происходит вход в условие

Рекурсия. Как происходит вход в условие

Имеется такая функция, которая вызывает сама себя, то есть рекурсивнаяДопустим n = 5

248
Как сделать простейший клиент для базы данных MSSQLS Express в Windows Forms приложении на C#

Как сделать простейший клиент для базы данных MSSQLS Express в Windows Forms приложении на C#

Сейчас я только понял как добавить в источники данных БДДальше не могу понять, как поступить дальше

254
Не виден picterbox на форме?

Не виден picterbox на форме?

Ругается на picturebox1 - хотя на форме он естьВо время выполнения NullReferenceException

227