【问题标题】:Stop the 'Ding' when pressing Enter按 Enter 时停止“叮”
【发布时间】:2011-09-11 13:39:00
【问题描述】:

我有一个非常简单的 Windows 窗体应用程序。而且,在 Windows(或至少是 Windows 窗体应用程序)中,当您在单行文本框控件中按 Enter 时,您会听到叮叮声。这是一个不愉快的声音,表明你不能输入换行符,因为它是一个单行文本框。

这一切都很好。但是,在我的表单中,我有 1 个文本框和一个搜索按钮。而且我允许用户在完成输入后通过按 Enter 来执行搜索,因此他们没有使用鼠标单击搜索按钮。

但是这个叮的声音出现了。这很烦人。

我们怎样才能让它在我的表单中根本不播放声音?

@David H - 这是我检测回车按下的方式:

private void textBox1_KeyUp(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        // Perform search now.
    }
}

【问题讨论】:

  • 当焦点在文本框时,如何检测到 Enter 被按下?
  • 在属性窗格中,双击 KeyDown 或 KeyUp 事件。然后,在代码视图中,键入我将要在我的问题中输入的代码。
  • KeyPress 可能是正确的事件,并且您要设置 e.Handled = true
  • 谢谢@David,我不知道这个:)
  • 我希望有某种方法可以抑制烦人的叮当声,但允许按键冒泡。有时候按键就是按键,不需要报警。

标签: c# winforms audio system-sounds


【解决方案1】:

它对我有用:

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{

    //Se apertou o enter
    if (e.KeyCode == Keys.Enter)
    {
        //enter key is down

        this.doSomething();

        e.Handled = true;
        e.SuppressKeyPress = true;

     }

 }

SuppressKeyPress 是真正的诀窍。希望对你有所帮助。

【讨论】:

  • 在我看来,这是唯一有效的答案。 e.Handled = true; 不足;是 SuppressKeyPress 成功了。
  • textBox1_KeyUp 在这种情况下会响起,不管 Handled 还是 SuppressKeyPress
  • ToolStripTextBox.KeyDown 一起为我工作。没有其他解决方案。谢谢!
  • 在我的 textboxKeyDown 活动中对我不起作用
  • 这应该是公认的答案。当前接受的答案需要在表单上放置一个标准按钮,这令人不快。
【解决方案2】:

查看Form.AcceptButton 属性。您可以使用它为表单指定默认按钮,在本例中为按 Enter。

来自文档:

此属性使您可以指定 发生的默认动作 用户在您的 应用。分配给的按钮 此属性必须是 当前的 IButtonControl 形成或位于容器内 当前表格。

还有一个CancelButton 属性用于当用户按下转义键时。

【讨论】:

  • 谢谢@mdm,这对我来说效果最好。 :) 当我有更多代表时,我会回来投票。
  • @bendr 我有同样的问题 .. 但我使用 UserControl .. 它没有 Form.AcceptButton .. 如何解决?
  • Visual Studio 的“属性”窗格中似乎没有此字段。显然,它必须在代码中完成。 this.AcceptButton = buttonOK; this.CancelButton = buttonCancel;
  • 这不适用于 ToolStripButtons,或者如果您想使用 ENTER 键验证 TextBox 或 ToolStripTextBox。更好的方法是 Lucio Fonseca 的答案,它使用 ToolStripTextBox 为我工作。
  • 我看不到你的解决方案你没有实际练习才能更开明
【解决方案3】:

试试

textBox.KeyPress += new KeyPressEventHandler(keypressed);

private void keypressed(Object o, KeyPressEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        e.Handled = true; //this line will do the trick
    }
}

【讨论】:

  • 正确,但仅当焦点仍在文本框上时才有效。如果用户先按Tab会怎样?
  • @mdm 取决于 UI 设计。当焦点在文本框上时,也许 OP 只想要这个动作。这很常见。
  • 如果用户按下Tab,焦点将不再在TextBox上,下一个将成为焦点的Contorl是Button Control,当你按下Enter时它不会发出声音。 :-)
  • @David,谢谢你的例子。我刚试过。并且每当我将 e.Handled = true 放在 .KeyPress 事件中时,其他代码都不会执行。唯一发生的事情是 TextBox 中的所有文本都被选中(我什至没有选择任何文本的代码)
  • Lucio Fonseca 的回答是我发现解决这个问题的唯一一个。
【解决方案4】:

只需在“if”语句中添加e.SuppressKeyPress = true;

private void textBox1_KeyUp(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        //If true, do not pass the key event to the underlying control.
        e.SuppressKeyPress = true;  //This will suppress the "ding" sound.*/

        // Perform search now.
    }
}

【讨论】:

    【解决方案5】:

    您可以使用 KeyPress 而不是 KeyUp 或 KeyDown 更有效 以下是处理方法

      private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)Keys.Enter)
            {
                e.Handled = true;
                button1.PerformClick();
            }
        }
    

    和'丁'说和平

    【讨论】:

    • 这对我来说非常有效。 e.Handled 显然禁用了“叮”。将“提交”按钮(在我的情况下)设为默认按钮对我不起作用,因为我想对表单上的其他文本框以不同的方式处理“输入”键。

      顺便说一句: 对于这个项目,我使用的是 VB。所以我没有转换 e.KeyChar,而是转换它: if e.KeyChar = ChrW(Keys.Enter Then ....
    • KeyDown 中,使用e.Handlede.SuppressKeyPress 对我不起作用- 仍然叮当。但是按照这里的建议更改它以使用 KeyPress' event and e.Handled` 做得很好。
    【解决方案6】:

    使用SuppressKeyPress 在处理完击键后停止继续处理。

    public class EntryForm: Form
    {
       public EntryForm()
       {
       }
    
       private void EntryTextBox_KeyDown(object sender, KeyEventArgs e)
       {
          if(e.KeyCode == Keys.Enter)
          {
             e.Handled = true;
             e.SuppressKeyPress = true;
             // do some stuff
    
          }
          else if(e.KeyCode == Keys.Escape)
          {
              e.Handled = true;
              e.SuppressKeyPress = true;
              // do some stuff
    
          }
       }
    
       private void EntryTextBox_KeyUp(object sender, KeyEventArgs e)
       {
          if(e.KeyCode == Keys.Enter)
          {
             // do some stuff
    
          }
          else if(e.KeyCode == Keys.Escape)
          {
             // do some stuff
    
          }
       }
    }
    

    【讨论】:

      【解决方案7】:

      在 WinForms 上,Enter 键会导致 Ding 声音,因为未指定表单属性 AcceptButton。 如果您不需要 AcceptButton,则可以通过将表单 KeyPreview 设置为 true 并输入以下 KeyPress 事件来抑制叮当声:

      private void Form_KeyPress(object sender, KeyPressEventArgs e)
      {
          if (e.KeyChar == '\r')
              e.Handled = true;
      }
      

      无论哪个控件处于活动状态,按下 Enter 键时都不会再发出叮当声。由于按键事件的处理顺序是 KeyDown、KeyPress 和 KeyUp,因此 Enter 键仍然适用于控件的 KeyDown 事件。

      【讨论】:

        【解决方案8】:

        我在尝试处理对我有用的 KeyDown 时偶然发现了这篇文章。

        If e.KeyCode = Keys.Enter Then
           e.SuppressKeyPress = True
           btnLogIn.PerformClick()
        End If
        

        按下按键会停止将事件发送到底层控件。如果您手动处理输入键将在该文本框中执行的所有操作,这应该可以工作。对 Visual Basic 感到抱歉。

        【讨论】:

          【解决方案9】:

          任何人得到这个答案的可能性很小,但其他一些答案真的很可怕。抑制KeyDown 上的事件会在一次打击中杀死 2 个额外的事件。在这种情况下,将 e.Handled 属性设置为 true 是没有用的。
          最好的方法是将Form.AcceptButton 属性设置为实际的搜索按钮。
          还有另一种使用Enter 键的方法——有些人可能希望它充当TAB 按钮。为此,添加一个新的Button,将其Location 属性设置在Form 区域之外(即(-100, -100)) - 在某些情况下,将Visible 属性设置为false 可能会禁用Button 处理程序。将Form.AcceptButton 属性设置为新按钮。在 Click 事件处理程序中添加以下代码
          this.SelectNextControl(ActiveControl, true, true, true, true)

          现在,您可能只想在 focus 上传输 focus TextBox 您可能想要测试 ActiveControl 类型或在不打算使用 @987654342 的控件的事件处理程序中使用 e.Supress 属性@作为TAB 而已。你甚至不需要捕获e.KeyCode

          【讨论】:

            【解决方案10】:
            $("#txtSomething").keypress(function (e) {
                    if (e.which == 13) {
            
                        e.Handled = true; //This will prevent the "ding" sound
            
                        //Write the rest of your code
                    }
                });
            

            【讨论】:

            • 这就是我要找的。​​span>
            【解决方案11】:

            将搜索按钮的IsDefault 属性设置为true。这将使其成为默认按钮,并在按下 Enter 时自动单击。

            【讨论】:

            • 来自您链接到To specify the default button of a form, set the AcceptButton property of the form to the desired button.的文档
            • 是的,我自己对此进行了调查。看来这两种方法是可以互换的。 AcceptButton 看起来更时尚,但我自己习惯了IsDefault
            【解决方案12】:

            好吧,我在这个问题上生活了足够长的时间,并在这里查找了它。

            在考虑了很长时间并想要最简单的方法来修复它之后,我想出了最简单但不太优雅的方法来修复它。

            这就是我所做的。

            1. 在表单上放置 2 个不可见的按钮“确定”和“取消”。
            2. 将表单上的 AcceptButton 和 CancelButton 属性设置为不可见按钮。
            3. 未向按钮添加代码!

            这解决了此线程中列出的所有次要问题,包括 ToolStripMenu。我最大的抱怨是 BindingNavigator,当我将记录号输入到当前位置以导航到并按下回车时。

            根据程序员在按下回车按钮时想要搜索功能的原始问题,我只是将搜索代码放在不可见的确定按钮中!

            到目前为止,这似乎解决了所有问题,但我们都知道使用 Visual Studio,可能会出现一些问题。

            我能想到的唯一其他可能的优雅方法是编写一个新的击键处理类,这对我的大多数项目来说都是一种工作方式。

            【讨论】:

              【解决方案13】:

              您可以将文本框多行设置为 true,然后按 Enter 键。

              private void yourForm_Load(object sender, EventArgs e)
                  {
                      textBox1.Multiline = true;
                  }
              
              //then write your TextBox codes
              private void textBox1_KeyUp(object sender, KeyEventArgs e)
              {
                  if (e.KeyCode == Keys.Enter)
                  {
                      // doSomething();
                  }
              }
              

              【讨论】:

                【解决方案14】:

                我更改了多行文本框的文本框属性,它对我有用。

                【讨论】:

                • 答案已于 2 月 22 日在下面说明。你也必须照顾 [enter] ;)
                【解决方案15】:

                关于e.SuppressKeyPress = true; 解决方案,它本身就可以正常工作。将SuppressKeyPress 设置为true 也将Handled 设置为true,因此无需使用e.Handled= true;

                【讨论】:

                  【解决方案16】:
                  void RTextBox_KeyDown(object sender, KeyEventArgs e)
                  {
                      if (e.KeyData == Keys.Enter)
                      {
                          //do ...
                          bool temp = Multiline;
                          Multiline = true;
                          e.Handled = true;
                          Multiline = temp;
                      }
                  }
                  

                  【讨论】:

                  • 这是一个多余的答案,只有代码,没有解释。此外,所有Multiline 代码都完全不相关。
                  猜你喜欢
                  • 2012-05-31
                  • 2022-01-09
                  • 2010-11-29
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-06-20
                  相关资源
                  最近更新 更多