代码之家  ›  专栏  ›  技术社区  ›  John Kraft

如何在键入“enter”或“esc”时停止窗口错误声音

  •  7
  • John Kraft  · 技术社区  · 15 年前

    我有一张表格,上面只有一个文本框。没有其他控制。每当我键入“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 回复  |  直到 15 年前
        1
  •  7
  •   Hans Passant    15 年前

    有一个更“正确”的解决方案,不管您有多少控件,它都可以工作,并遵循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
  •  12
  •   Andrew    15 年前

    在keydown事件中,设置 e.Handled = true e.SuppressKeyPress = true .

        3
  •  2
  •   BillW    15 年前

    对nobugz的答复太长,不适合发表评论。如果按原样使用nobugz代码:

    1. 表单将被隐藏 无论窗体上的哪个控件处于活动状态并且具有键盘输入焦点,这都与窗体的“keypreview”属性设置为“true”还是“false”无关。

    要使processCmdKeys over ride中只隐藏一个特定控件(在本例中是一个名为“textbox1”的文本框),需要执行以下操作:

    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
    

    但是,带上“一粒盐”吧,因为我不能肯定这是必要的。