我有一个带有单个文本框的表单。没有其他控制。每当我输入“Enter”键或“Esc”键时,表单就会按照我的意愿运行;但我听到可怕的Windows错误声音。代码看起来类似于以下内容......
public class EntryForm: Form
{
public EntryForm()
{
}
private void EntryTextBox_KeyUp(object sender, KeyEventArgs e)
{
if(e.KeyCode == Keys.Enter)
{
// do some stuff
Hide(); // I've also used DialogResult = DialogResult.OK here
e.Handled = true;
}
else if(e.KeyCode == Keys.Escape)
{
Hide(); // I've also used DialogResult = DialogResult.Cancel here
e.Handled = true;
}
}
}
我可以通过在表单的构造函数中添加以下代码来“破解”它并使噪声停止。
AcceptButton = new Button();
CancelButton = new Button();
正如我所说,这导致声音无法发挥,但我认为这是不好的形式;特别是因为我不需要表格上的按钮。
任何人都知道为什么这是行为,是否有更简洁的方法来阻止播放错误声音?
答案 0 :(得分:12)
在KeyDown事件中,设置e.Handled = true
和e.SuppressKeyPress = true
。
答案 1 :(得分:7)
有一个更“正确”的修复程序,无论你有多少控件都可以使用,并遵循Windows窗体设计模型。将此代码粘贴到表单中:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
if (keyData == Keys.Escape || keyData == Keys.Enter) {
this.Hide();
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
答案 2 :(得分:2)
对Nobugz的回答太长了,以回应评论。如果您按原样使用Nobugz代码:
这里只需要在ProcessCmdKeys over-ride中隐藏一个特定的控件(在本例中是一个名为'textBox1的TextBox):
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (msg.HWnd == textBox1.Handle)
{
if (keyData == Keys.Escape || keyData == Keys.Enter)
{
textBox1.Hide();
return true;
}
}
return base.ProcessCmdKey(ref msg, keyData);
}
当然如果你想处理需要隐藏的多个控件的情况,你可以实现一个'switch语句或其他任何东西来测试msg.HWnd:注意我在这里假设所有可能有键盘的控件输入将具有有效的HWnd。
我使用这种技术的情况的一些记忆(模糊),以及文本输入控件在某种程度上仍然有键盘输入焦点...当我不打算...它让我想添加一个额外的像这样测试:
&& this.ActiveControl == textBox1
但是,因为我不能确定它是必要的,所以带着“一粒盐”。