无法在文本框 keydown 事件上禁用哔声

Posted

技术标签:

【中文标题】无法在文本框 keydown 事件上禁用哔声【英文标题】:Cannot disable beep sound on textbox keydown event 【发布时间】:2013-10-07 07:56:43 【问题描述】:

下面是我在文本框KeyDown() 事件上按“Enter”时禁用哔声的代码:

if (e.KeyCode == Keys.Enter)

    e.SuppressKeyPress = true;
    SaveData();
    e.Handled = true;

但是当我在文本框上按“Enter”时它会一直发出哔哔声。我做错了什么?

【问题讨论】:

不是操作系统发出的声音吗? 是的 Windows 哔声。如何禁用它? @Dhaval 正如您从我的代码中看到的那样,我还将 HandledSuppressKeyPress 设置为 true,但它不起作用。 @Shohin 对不起我的错误 也许声音是由其他东西发出的?想不出是什么,也许是另一个TextBox 或表格。 【参考方案1】:

在您的 cmets 中,显示 MessageBox 会干扰您对 SuppressKeyPress 属性的设置。

解决方法是将 MessageBox 的显示延迟到方法完成后:

void TextBox1_KeyDown(object sender, KeyEventArgs e) 
  if (e.KeyCode == Keys.Enter) 
    e.SuppressKeyPress = true;
    this.BeginInvoke(new Action(() => SaveData()));
  

【讨论】:

【参考方案2】:

编辑

请注意,LarsTech (below) 提供的答案要好得多。


抱歉,我刚刚意识到您有一个 MessageBox 正在显示。

你可以做的是有一个Timer 并让它触发SaveData() 方法。

private void Timer1_Tick(System.Object sender, System.EventArgs e)

    Timer1.Enabled = false;
    SaveData();

然后在您的 TextBox 按键事件中,执行以下操作:

if (e.KeyCode == Keys.Enter) 
    e.SuppressKeyPress = true;
    Timer1.Enabled = true;

这似乎行得通...

【讨论】:

没问题,我很高兴能帮上忙 =] 不使用 Timer,更优雅的解决方案是使用 this.BeginInvoke() 来延迟 MessageBox 并防止蜂鸣。请参阅下面的 LarsTech 答案。 @MarisB。抱歉,这个答案是很久以前我刚开始的时候做出的。我同意下面的答案是更好的方法。我可以更新我的答案。【参考方案3】:

您可以尝试创建自己的文本框并像这样处理 keydown 事件:

public class MyTextBox : TextBox


    protected override void OnKeyDown(KeyEventArgs e)
    
        switch (e.KeyCode)
                  
            case (Keys.Return):
              /*
               * Your Code to handle the event
               * 
               */                   
                return;  //Not calling base method, to stop 'ding'
        

        base.OnKeyDown(e);
    

【讨论】:

以上是关于无法在文本框 keydown 事件上禁用哔声的主要内容,如果未能解决你的问题,请参考以下文章

在捕获keydown事件时如何在文本框中允许退格

如何在 keydown 事件后在文本框中按 enter 删除虚拟键盘

为啥 e.Handled 不停止哔哔声?

表单事件(jQuery)

js键盘相关知识总结

在 JS/jQuery 中触发 keypress/keydown/keyup 事件?