Избегайте "звонка" Windows при нажатии Enter в TextBox с помощью OnKeyUp
Если пользователь нажимает клавишу ввода в текстовом поле формы Windows с событием KeyUp, Windows издает звуковой сигнал или сигнал. Я не мог определить, почему это происходит и как я мог избежать этого.
Любая помощь будет оценена.
6 ответов
Я предполагаю, что это вызвано комбинацией:
MultiLine = false
- Нет кнопки по умолчанию на форме
потому что однострочные текстовые поля направляют клавишу ввода к кнопке по умолчанию. Дин генерируется, когда кнопка по умолчанию не может быть найдена.
Актуальное решение для избавления от звука:
private void TextBox_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
e.SuppressKeyPress = true;
}
}
Вот фактический ответ:
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
Это съедает нажатие клавиши, что предотвращает динь.
После нескольких часов поиска решения, я только что нашел обходной путь, но не реальное решение этой проблемы. Теперь я использую 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();
}
}
И полезное предложение для всех разработчиков: не тестируйте свои приложения без звука.;-)
Ни одно из перечисленных выше решений не помогло мне... но вот мое простое решение!
Он работает только тогда, когда вам больше не нужна кнопка 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"!
У меня была версия этой проблемы, которая возникала, когда я вызывал 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 (поскольку у меня сложилось впечатление, что invoke добавляет сообщение в основную очередь сообщений, что вызывает вызов метода при обработке этого сообщения):
BeginInvoke((MethodInvoker)delegate {
SelectProduct(); // <-- pops the size selection dialog
});
Хотите верьте, хотите нет, но это починили - без звонка.
(Я обычно использую вызовы, когда мне нужно обновить представление, когда фоновый поток вызывает обратный вызов, так как представления WinForms не позволяют обновляться из потока, отличного от основного потока.)
Поэтому я предполагаю, что в пользовательском элементе управления, где находится однострочное текстовое поле, нужна кнопка подтверждения, но в пользовательском элементе управления отсутствует свойство AcceptButton.
Программирование на WinForms кажется черным искусством. Полагаю, как и любой другой вид программирования.