避免使用OnKeyUp在文本框中按Enter键时'Ding' Windows



当用户在windows窗体文本框中键入KeyUp事件时,windows发出哔哔声或ding。我不知道为什么会发生这种情况,也不知道如何避免。

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

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

我认为这是由以下因素组合造成的:

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

,因为单行文本框将输入键转发给默认按钮。当无法找到默认按钮时,会生成此ding。

实际答案如下:

    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();
    }
}

给所有开发者一个有用的建议:不要用静音测试你的应用程序。: -)

以上解决方案都不能满足我的需求。但这是我的简单解决方案!
只有当你不再需要在应用程序中使用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。

当用户从单行文本框中按enter键时,当我从自定义控件调用myDialog.ShowDialog()时,会发生这个问题的一个版本。

(他们在文本框中输入产品编号,按回车键,然后弹出对话框,让他们从可用的尺寸中选择。但如果每次对话框弹出时都播放铃声,那就太烦人了。

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

我想也许事件以某种方式传递给了对话框,所以我在表单级别和表单的每个元素上捕获了keydown事件,并在每个元素中设置了e.Handled和e.SuppressKeypress,但这并没有修复它。

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

在调用myDialog.ShowDialog()之前,我尝试调用Application.DoEvents(),但这并没有解决它。

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

. .我想,如果我让当前事件在限定词播放时结束,然后在之后弹出对话框会怎么样?

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

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

信不信由你,这就解决了——没有铃声。

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

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

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

最新更新