如何从.Net窗体的PreFilterMessage()关闭该窗体?

如何从.Net窗体的PreFilterMessage()关闭该窗体?,.net,window,messages,.net,Window,Messages,我正在使用PreFilterMessage筛选表单中的消息,如下所示: 打印(“代码样本”) 打印(“代码样本”) 但问题是,表单只是第一次关闭。重新打开表单后,按ESC键将不再关闭该表单 我怎样才能做到这一点 谢谢我不知道这是否适合你的工作。我通常将Form.CancelButton设置为表单上的“关闭”或“取消”按钮,当用户点击键盘上的Esc键时,它会自动单击该按钮。根据MSDN 关闭时未处理表单的两个条件是:(1)它是多文档界面(MDI)应用程序的一部分,并且表单不可见;(2)您已经使用S

我正在使用PreFilterMessage筛选表单中的消息,如下所示:

打印(“代码样本”)

打印(“代码样本”)

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

我怎样才能做到这一点


谢谢

我不知道这是否适合你的工作。我通常将Form.CancelButton设置为表单上的“关闭”或“取消”按钮,当用户点击键盘上的Esc键时,它会自动单击该按钮。

根据MSDN

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

如果您确实使用
ShowDialog()
显示了表单,那么调用
Close()
不会处理表单。以后你仍然可以“重新打开”它,也许这就是你正在做的。我怀疑您可能在第一次关闭它时中断了
PreFilterMessage()
。您是否检查了消息循环是否仍在工作?或者您应该实际执行
this.Visible=false
控件。隐藏

在显示为无模式窗口的窗体上调用Close方法时,不能调用Show方法使窗体可见,因为窗体的资源已被释放。要隐藏窗体并使其可见,请使用控件..::.hide方法

因为你以后需要重新打开它。如果您确实希望表单dispose关闭,并在稍后显示新实例,则在关闭后手动调用该表单的dispose

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