Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在键入';输入';或';Esc&x27;_C#_Winforms - Fatal编程技术网

C# 如何在键入';输入';或';Esc&x27;

C# 如何在键入';输入';或';Esc&x27;,c#,winforms,C#,Winforms,我有一个表单,上面只有一个文本框。没有其他控件。每当我键入“回车”键或“Esc”键时,表单就会按我的要求运行;但我听到了可怕的Windows错误声音。代码看起来类似于以下内容 public class EntryForm: Form { public EntryForm() { } private void EntryTextBox_KeyUp(object sender, KeyEventArgs e) { if(e.KeyCode == Keys.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();
正如我所说,这会导致声音无法播放,但我认为这是一种糟糕的形式;特别是因为我不需要表单上的按钮


有人知道这是为什么吗?如果有更干净的方法阻止错误声音播放?

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

有一个更“正确”的修正,无论有多少控件都可以使用,并且遵循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);
}

这是一个太长的答复Nobugz的答案,适合在评论。如果按原样使用Nobugz代码:

  • 无论窗体上的哪个控件处于活动状态且具有键盘输入焦点,窗体都将被隐藏,这与窗体的“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
    

    但是,请恕我直言,因为我不能肯定这是必要的。

    如果你没有任何按钮,当你按下enter键或esc键时,你是如何让对话框形成的?当您按enter或esc键时,带有JU编辑控件的窗体通常只会坐在那里。@John Knoweller-Hide()方法隐藏窗体。还可以将visible属性设置为false。如果以模式显示表单,只需设置代码中的对话框结果,表单就会消失。@Andrew-这样做对行为没有任何影响。不过,感谢您的回答,因为我以前从未见过SuppressKeyPress属性<代码>e.Handled=trueevent@BillW-谢谢你提供的额外信息。在这种情况下,我确实希望整个表单被隐藏;但这些信息对未来来说是很好的。