0

I'm filtering the messages that come to a form with PreFilterMessage like this:

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");

but the matter is that form closes only for the first time. After reopening a form it won't close anymore by pressing ESC.

How can I accomplish this?

Thanks

4

2 回答 2

1

I don't know if this fits with what you are doing. I usually set Form.CancelButton to the close or cancel button on my form, and it will automatically call the button OnClick when the user hits Esc on the keyboard.

于 2008-10-22T12:44:40.807 回答
0

根据 MSDN

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

如果您确实使用 向您展示了表单ShowDialog(),则调用Close()不会从您的表单中删除。您仍然可以稍后“重新打开”它,并且可能这就是您正在做的事情。我怀疑您PreFilterMessage()在第一次关闭它时可能会打扰它。您是否检查过消息循环是否仍在工作?或者你实际上应该做this.Visible = false;or Control.Hide,

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

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

于 2008-10-24T03:27:09.323 回答