如何从PreFilterMessage()关闭.Net表单?

时间:2008-10-22 12:32:15

标签: .net window messages

我正在使用PreFilterMessage过滤来自表单的消息,如下所示:

print("code sample");

 public bool PreFilterMessage(ref Message m) 
 {
     if (m.Msg == WM_KEYDOWN && (int)m.WParam == VK_ESCAPE)
     {
         this.Close();
         return true;
     }
     return false;
 }

print("code sample");

但问题是表格只是第一次关闭。重新打开表单后,按ESC键将不再关闭。

我该如何做到这一点?

由于

2 个答案:

答案 0 :(得分:1)

我不知道这是否符合您的要求。我通常将Form.CancelButton设置为我的表单上的关闭或取消按钮,当用户点击键盘上的Esc时,它会自动调用OnClick按钮。

答案 1 :(得分:0)

根据MSDN

  

表单未在Close上处理时的两个条件是(1)它是多文档界面(MDI)应用程序的一部分,并且表单不可见; (2)您使用ShowDialog显示了表单。在这些情况下,您需要手动调用Dispose以标记所有表单的垃圾回收控件。

如果您确实使用ShowDialog()向您展示了表单,则调用Close()不会丢弃您的表单。你以后仍然可以“重新打开”它,可能就是你正在做的事情。我怀疑你第一次关闭它时可能已经破坏了PreFilterMessage()。你有没有检查消息循环是否仍然有效?或者您应该this.Visible = false;Control.Hide

  

在显示为无模式窗口的窗体上调用Close方法时,无法调用Show方法使窗体可见,因为窗体的资源已被释放。要隐藏表单然后使其可见,请使用Control .. ::。Hide方法。

因为您需要稍后“重新打开”它。如果您实际上希望表单处理掉,并稍后显示一个新实例,那么在关闭后手动调用dispose