使用OnKeyUp在TextBox中按Enter键时避免使用Windows“Ding”

时间:2011-07-12 07:23:47

标签: .net winforms beep

如果用户点击带有 KeyUp 事件的Windows窗体文本框,则窗口会发出哔声或叮当声。我无法确定为什么会发生这种情况以及如何避免这种情况。

任何帮助都将不胜感激。

6 个答案:

答案 0 :(得分:11)

摆脱声音的实际解决方案:

private void TextBox_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        e.SuppressKeyPress = true;
    }
}

答案 1 :(得分:8)

我想这是由以下因素组合引起的:

  • MultiLine = false
  • 表单上没有默认按钮

因为单行文本框将回车键转发到默认按钮。无法找到默认按钮时会生成ding。

答案 2 :(得分:3)

以下是实际答案:

    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

这会按下按键,这可以防止叮咬。

答案 3 :(得分:1)

经过几个小时的挖掘解决方案,我得到了一个解决方法,但不是解决这个问题的真正解决方案。现在我正在使用 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();
    }
}

对所有开发人员都有一个有用的建议:不要测试你的应用程序静音。 ; - )

答案 4 :(得分:0)

上述解决方案都没有为我完成这项工作......但这是我的简单解决方案! 只有在您的应用程序中不再需要Acceptbutton时,它才有效。

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”时,你不会听到焦点对特定文本框的ping!

答案 5 :(得分:0)

当用户从单行文本框中输入时,我从自定义控件调用myDialog.ShowDialog()时会出现此问题的版本。

(他们将产品编号放入文本框,按回车键,弹出对话框,让他们从可用尺寸中进行选择。但如果每次弹出对话框时都会播放铃声,那就太麻烦了。)

我在文本框中捕获了按键事件,并设置了e.Handled和e.SupressKeypress,但这并没有解决问题。然后我注意到如果我注释掉对myDialog.ShowDialog()的调用,那么我没有得到声音,就像那样奇怪。在那种情况下,e.Handled和e.SupressKeypress确实阻止了铃声。

我想也许事件以某种方式被传递到对话框,所以我在表单级别和表单的每个元素上捕获了keydown事件,并且完全按键,并设置e.Handled和e.SuppressKeypress其中每一个,但没有解决它。

我尝试在表单上放置一个提交按钮,并将表单的AcceptButton属性设置为该按钮,但这也无济于事。

我在调用myDialog.ShowDialog()之前尝试调用Application.DoEvents(),但是没有修复它。

我注意到,即使调用myDialog.ShowDialog()被注释掉,调用Application.DoEvents()也会导致铃声播放!好像调用DoEvents正在处理当前事件而不关注e.Handled和e.SupressKeypress限定符。

所以..我想如果我在限定符发挥时让当前事件发挥作用,然后然后提升我的对话框会怎么样?

所以我将myDialog.ShowDialog()放入BeginInvoke部分(因为我的印象是,调用会在主消息队列中添加一条消息,导致在处理该消息时调用该方法):

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

信不信由你,修好了 - 没有铃声。

(当我需要在后台线程调用回调时更新视图时,我通常使用调用,因为WinForms视图不允许从主线程以外的线程更新它们。)

所以我猜测单行文本框所在的自定义控件是需要接受按钮的位置 - 但是自定义控件没有AcceptButton属性。

WinForms编程似乎有点像黑色艺术。就像其他类型的编程一样,我想。