无法在文本框 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 正如您从我的代码中看到的那样,我还将Handled
和 SuppressKeyPress
设置为 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 事件上禁用哔声的主要内容,如果未能解决你的问题,请参考以下文章