键入“Enter”或“Esc”时如何停止窗口错误声音

时间:2009-12-30 22:49:20

标签: c# winforms

我有一个带有单个文本框的表单。没有其他控制。每当我输入“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();

正如我所说,这导致声音无法发挥,但我认为这是不好的形式;特别是因为我不需要表格上的按钮。

任何人都知道为什么这是行为,是否有更简洁的方法来阻止播放错误声音?

3 个答案:

答案 0 :(得分:12)

在KeyDown事件中,设置e.Handled = truee.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代码:

  1. 无论表单上的哪个控件处于活动状态并具有键盘输入焦点,表单都将被隐藏,这与表单是否将'KeyPreview属性设置为'true或者“假。
  2. 这里只需要在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
    

    但是,因为我不能确定它是必要的,所以带着“一粒盐”。