.net 使用OnKeyUp在文本框中按Enter键时避免Windows“叮当”

.net 使用OnKeyUp在文本框中按Enter键时避免Windows“叮当”,.net,winforms,beep,.net,Winforms,Beep,如果用户在windows窗体文本框中点击enter键并出现键控事件,windows会发出嘟嘟声或叮当声。我无法确定为什么会发生这种情况,以及如何避免这种情况 任何帮助都将不胜感激。经过几个小时的探索,我找到了一个解决方案,但不是这个问题的真正解决方案。现在我使用的是KeyDown 对所有开发人员来说,这是一个有用的建议:不要在静音的情况下测试应用程序- 我想这是由以下因素共同造成的: 多行=假 表单上没有默认按钮 因为单行文本框将enter键转发到默认按钮。当无法找到默认按钮时,将生成叮当声。以

如果用户在windows窗体文本框中点击enter键并出现键控事件,windows会发出嘟嘟声或叮当声。我无法确定为什么会发生这种情况,以及如何避免这种情况


任何帮助都将不胜感激。

经过几个小时的探索,我找到了一个解决方案,但不是这个问题的真正解决方案。现在我使用的是KeyDown


对所有开发人员来说,这是一个有用的建议:不要在静音的情况下测试应用程序-

我想这是由以下因素共同造成的:

多行=假 表单上没有默认按钮
因为单行文本框将enter键转发到默认按钮。当无法找到默认按钮时,将生成叮当声。

以下是实际答案:

    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

这会吃掉按键,从而防止叮当声

消除声音的实际解决方案:

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

以上所有解决方案都不适合我。。。但这是我的简单解决方案! 只有当你不再需要应用程序中的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;
}

这样,当按下“回车”键时,您就不会听到特定文本框上带有焦点的ping声

当用户从单行文本框中按enter键时,我从自定义控件调用myDialog.ShowDialog时,会出现此问题的一个版本

他们在文本框中输入产品编号,点击回车键,弹出对话框,让他们从可用尺寸中进行选择。但如果每次对话框弹出时都有铃声响起,那就太烦人了

我在文本框中捕获了按键下降事件,并设置了e.Handled和e.superskeypress,但这并没有解决问题。然后我注意到,如果我对myDialog.ShowDialog的调用进行了注释,那么我就没有听到声音,尽管这很奇怪。在这种情况下,e.Handle和e.SupersKeyPress确实阻止了铃声

我想可能事件以某种方式传递到了对话框中,所以我在表单级别和表单中所有接受击键的元素上捕获了keydown事件,并在每个元素中设置了e.Handled和e.SuppressKeypress,但这并没有解决它

我尝试在表单上放置一个提交按钮,并将表单的AcceptButton属性设置为该按钮,但这也没有帮助

在调用myDialog.ShowDialog之前,我尝试调用Application.DoEvents,但没有解决问题

我注意到调用Application.DoEvents会导致铃声响起,即使对myDialog.ShowDialog的调用被注释掉了!好像调用DoEvents是在处理当前事件,而没有注意e.Handled和e.supersKeypress限定符

所以。。我想,如果我在预选赛进行期间让当前事件继续进行,然后在那之后提出我的对话,会怎么样

因此,我将myDialog.ShowDialog放入BeginInvoke部分,因为我的印象是调用会将消息添加到主消息队列中,从而在处理该消息时调用该方法:

        BeginInvoke((MethodInvoker)delegate {
            SelectProduct(); // <-- pops the size selection dialog
        });
信不信由你,这把它修好了——没有铃声

我通常在后台线程调用回调时需要更新视图时使用invokes,因为WinForms视图不允许从主线程以外的线程更新自己

所以我猜自定义控件(单行文本框所在的位置)是需要accept按钮的位置,但是自定义控件没有AcceptButton属性


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

替代ProcessCmdKey,使它可以在任何有焦点的控件上工作。识别钥匙时返回true。输入可避免叮当声。您可以使用Button.PerformClick顺便说一句,Button.PerformClick是一个很好的观点。我不知道。但是ProcessCmdKey会使我的工作复杂化,因为我有很多按钮和文本框。我总是需要检查谁是发送者。我正在使用ProcessDialogKey方法处理一些全局键事件,如F3用于保存,F1用于帮助…现在我了解了这个问题。我查过了。With MultiLine=false:如果我在forms acceptbutton中设置此按钮,它将立即激活。所以没有叮当声,但我有许多其他按钮,这不是我的接受按钮。如果我设置MultiLine=true,叮当声也消失了。这是我喜欢的,另外WordWrap=false。谢谢你的帮助。
        BeginInvoke((MethodInvoker)delegate {
            SelectProduct(); // <-- pops the size selection dialog
        });