Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB .NET > Как избавиться от звука при нажатии клавиш?


Автор: tvlad 28.12.2012, 09:11
Как избавиться от звука при нажатии управляющей комбинации клавиш, когда в фокусе находится тексбокс?
Вот пример:
Код

Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    ...
    ElseIf e.Control And e.KeyCode = Keys.O Then
        e.SuppressKeyPress = True ' не помогает
        e.Handled = True ' не помогает
        btnOpen.Focus() ' не помогает
        btnOpen.PerformClick() ' функция, приписанная этой комбинации (выполняется, но сопровождается противным писком)
    ...
End Sub

Свойство KeyPreview для формы установлено в True.

Автор: shurikv 29.12.2012, 07:47
Проверял на VS-2008

1 - e.SuppressKeyPress = True - работает
2 - btnOpen.PerformClick() - звуков не издает

Может у тебя звук издает MsgBox() при появлении? 
Или еще что-то?

Автор: tvlad 29.12.2012, 09:09
e.SuppressKeyPress = True в процедуре обработки KeyDown помогает избавиться от писка при нажатии Enter в однострочном текстбоксе, а для комбинаций с Ctrl - не помогает.
Помогла вот такая штука (подсказали на похожем форуме):
Код

    Private Sub Form1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Me.KeyPress
        If Asc(e.KeyChar)= 15 Then e.Handled = True
    End Sub


Автор: shurikv 30.12.2012, 09:50
Не знаю причины, почему у тебя не работает, а у меня все пашет.
С проблемой звука при Enter сталкнулся давно. Ответ нашел в интернете (дата файлика с ответом 25-11-2008).
Но я тогда еще не перешел на VS-2008, а писал на VS-2003. Там к сожалению свойства "SuppressKeyPress" еще не было. Поэтому 

пришлось придумать обходной путь.
Выяснил, что этот звук - системный и задается в настройках "Звуки и аудиоустройства", закладка "Звуки", раздел "Программные события" - 

"Стандартный звук". Задаешь другой WAV-файл, меняется звук. Нашел по имени файла параметр в реестре

[HKEY_CURRENT_USER\AppEvents\Schemes\Apps\.Default\.Default\.Current]
@="Windows Vista Default.wav"


Дальше совсем просто: программа запустилась, стерла в реестре параметр, при закрытии восстановила. Варварский метод, но работал.

Когда перешел на VS-2008 стал пользоваться свойством "SuppressKeyPress", что намного проще.
Хотя вариант с "e.Handled = True" мне очень понравился, жаль не знал о нем раньше.

И маленький совет: выражение  
If Asc(e.KeyChar) = 15 Then e.Handled = True
предлагаю заменить на короткое  
e.Handled = (Asc(e.KeyChar) = 15)
или корректное  
e.Handled = CBool(Asc(e.KeyChar) = 15)

Но сам я предпочитаю более длинное, но более понятное (я не в состоянии помнить все управляющие коды)
e.SuppressKeyPress = CBool(e.Control And e.KeyCode = Keys.O)
Кстати, я у себя проверял все эти выражения.

Автор: tvlad 30.12.2012, 20:33
Спасибо за совет. Действительно, в этом случае можно обойтись без ветвления, мне как-то в голову не приходило.
А насчет звука - не знаю, почему у меня этот вариант (e.SuppressKeyPress = True) не срабатывает. Я пользуюсь VS2010, но не думаю, что это как-то влияет.

Автор: tvlad 31.12.2012, 06:12
Кстати, для получения кодов клавиш и знаков я пользуюсь этим:
Код
    Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
        Label3.Text = e.KeyCode
    End Sub

    Private Sub Form1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Me.KeyPress
        Label4.Text = Asc(e.KeyChar)
    End Sub

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)