10

如果用户在带有KeyUp事件的 Windows 窗体文本框中按 Enter 键,则 Windows 会发出哔声或 ding 声。我无法确定为什么会发生这种情况以及如何避免这种情况。

任何帮助,将不胜感激。

4

6 回答 6

13

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

private void TextBox_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        e.SuppressKeyPress = true;
    }
}
于 2013-02-10T13:35:04.067 回答
9

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

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

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

于 2011-07-12T13:23:39.967 回答
4

以下是实际答案:

    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

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

于 2013-01-30T14:30:30.107 回答
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();
    }
}

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

于 2011-07-12T09:39:34.947 回答
0

以上解决方案都没有为我完成工作......但这是我的简单解决方案!
它仅在您不再需要应用程序中的接受按钮时才有效。

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!

于 2013-08-20T17:37:05.367 回答
0

当用户从单行文本框按回车键时,我从自定义控件调用 myDialog.ShowDialog() 时,我遇到了这个问题的一个版本。

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

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

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

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

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

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

所以.. 我想如果我让当前事件在预选赛进行时播放,然后在此之后引发我的对话呢?

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

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

信不信由你,这解决了它 - 没有铃声。

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

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

WinForms 编程似乎有点玄学。就像所有其他类型的编程一样,我猜。

于 2017-02-17T22:05:09.890 回答