UserControl KeyDown事件不会触发撤销Windows应用程序KeyDown事件

我有UserControl并面临KeyDown事件的问题。 我的UserControls将显示反对撤销Windows窗体keydown事件如下所示:

用户控件的事件:

private void UserControl_KeyDown(object sender,KeyEventArgs e) { if ((Keys)e.KeyCode == Keys.Escape) { this.Visible = false; } } 

上面的事件将不得不隐藏UserControl,但事件不会因为撤销窗体keydown而触发,如下所示:

Windows窗体:

 private void button1_Click(object sender, EventArgs e) { panel1.SendToBack(); panel2.SendToBack(); panel3.SendToBack(); panel4.SendToBack(); am.Focus(); this.KeyDown -= new KeyEventHandler(Form1_KeyDown); } 

这将显示UserControls作为UserControls被添加到Windows窗体,如下所示:

  private UserControl.UserControl am = new UserControl.UserControl(); public Form1() { InitializeComponent(); this.Controls.Add(am); } 

我想撤消对可见的UserControl winform的keydown事件,并激发UserControl的keydown事件隐藏UserControl,但它不是很好。 UserControl事件的keydown事件不是火。 不知道为什么? 如何以正确的方式做同样的事情?

Solutions Collecting From Web of "UserControl KeyDown事件不会触发撤销Windows应用程序KeyDown事件"

键盘通知将张贴到焦点的控件。 这几乎从来不是一个用户控件,它不想要的焦点。 即使您使用Focus()方法明确设置焦点,也会立即将其传递给其子控件之一。 UserControl被设计成只是其他控件的容器。

改写ProcessCmdKey()方法。 将这段代码粘贴到控件类中:

  protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { if (keyData == Keys.Escape) { this.Visible = false; return true; } return base.ProcessCmdKey(ref msg, keyData); } 

请注意,使用Escape键并不是最好的主意,您将用户控制的表单可能需要该键。 就像一个对话框。