Избегайте «звонка» Windows при нажатии Enter в TextBox с помощью OnKeyUp - PullRequest
9 голосов
/ 12 июля 2011

Если пользователь нажимает клавишу ввода в текстовом поле Windows формы с событием KeyUp , Windows издает звуковой сигнал или дин . Я не мог определить, почему это происходит и как я мог избежать этого.

Любая помощь будет оценена.

Ответы [ 6 ]

11 голосов
/ 10 февраля 2013

Актуальное решение для избавления от звука:

private void TextBox_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        e.SuppressKeyPress = true;
    }
}
8 голосов
/ 12 июля 2011

Я полагаю, что это вызвано комбинацией:

  • MultiLine = false
  • Нет кнопки по умолчанию в форме

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

3 голосов
/ 30 января 2013

Вот фактический ответ:

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

Это съедает нажатие клавиши, что предотвращает динь.

1 голос
/ 12 июля 2011

После нескольких часов поиска решения, я только что нашел обходной путь, но не реальное решение этой проблемы. Теперь я использую KeyDown .

private void tbSearch_KeyDown( object sender, KeyEventArgs e )
{
    if ( e.KeyCode == Keys.Enter )
    {
         e.Handled = true;
         // Call Button event
         //btnSearch_Click( sender, EventArgs.Empty );
         // cleaner code. Thanks to Hans.
         btnSearch.PerformClick();
    }
}

И полезное предложение для всех разработчиков: не тестируйте свои приложения без звука. ; -)

0 голосов
/ 18 февраля 2017

У меня была версия этой проблемы, которая возникала, когда я вызывал myDialog.ShowDialog () из пользовательского элемента управления, когда пользователь нажимал клавишу ввода из однострочного текстового поля.

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

Я перехватил событие нажатия клавиши в текстовом поле и установил e.Handled и e.SupressKeypress, но это не решило проблему. Затем я заметил, что если я закомментировал вызов myDialog.ShowDialog (), то я не получил звук, какой бы странный он ни был. В этом случае e.Handled и e.SupressKeypress действительно предотвратили звонок.

Я подумал, что, может быть, событие каким-то образом передается диалогу, поэтому я перехватил событие keydown на уровне формы и на каждом элементе формы, который вообще принимает нажатия клавиш, и установил e.Handled и e.SuppressKeypress в каждый из них, но это не исправило это.

Я попытался поместить кнопку отправки в форму и присвоить этой кнопке свойство AcceptButton формы, но это тоже не помогло.

Я пытался вызвать Application.DoEvents () перед вызовом myDialog.ShowDialog (), но это не помогло.

Я заметил, что при вызове Application.DoEvents () звонок воспроизводился, даже когда был закомментирован вызов myDialog.ShowDialog ()! Как будто вызов DoEvents обрабатывал текущее событие, не обращая внимания на классификаторы e.Handled и e.SupressKeypress.

Итак ... Я подумал, что если я позволю текущему событию разыгрываться, пока идут квалификаторы, и , тогда вызовет мой диалог после этого?

Поэтому я поместил myDialog.ShowDialog () в раздел BeginInvoke (поскольку у меня сложилось впечатление, что вызов добавляет сообщение в основную очередь сообщений, что вызывает вызов метода при обработке этого сообщения):

        BeginInvoke((MethodInvoker)delegate {
            SelectProduct(); // <-- pops the size selection dialog
        });

Хотите верьте, хотите нет, но это починили - без звонка.

(Я обычно использую вызовы, когда мне нужно обновить представление, когда фоновый поток вызывает обратный вызов, поскольку представления WinForms не позволяют обновляться из потока, отличного от основного потока.)

Итак, я предполагаю, что в пользовательском элементе управления, где находится однострочное текстовое поле, нужна кнопка подтверждения, но пользовательский элемент управления не имеет свойства AcceptButton.

Программирование на WinForms кажется черным искусством. Полагаю, как и любой другой вид программирования.

0 голосов
/ 20 августа 2013

Ни одно из вышеперечисленных решений не помогло мне ... но вот мое простое решение!
Он работает только тогда, когда вам больше не нужна кнопка Accept в вашем приложении.

private void txtPassword_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter) { cmdLogin.PerformClick(); }
}

private void txtPassword_Enter(object sender, EventArgs e)
{
    this.Acceptbutton = this.cmdLogin;
}

private void txtPassword_Leave(object sender, EventArgs e)
{
    this.Acceptbutton = Null;
}

Таким образом, вы не услышите пинг в определенном текстовом поле с фокусом, когда нажмете «Enter»!

...