0

次のような 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 を押しても閉じられません。

どうすればこれを達成できますか?

ありがとう

4

2 に答える 2

1

これがあなたのしていることと一致するかどうかはわかりません。通常、Form.CancelButton をフォームの閉じるボタンまたはキャンセル ボタンに設定します。ユーザーがキーボードで Esc キーを押すと、OnClick ボタンが自動的に呼び出されます。

于 2008-10-22T12:44:40.807 に答える
0

MSDNによると

フォームがCloseに配置されない場合の2つの条件は、(1)フォームがMultiple-Document Interface(MDI)アプリケーションの一部であり、フォームが表示されない場合です。(2)ShowDialogを使用してフォームを表示しました。このような場合は、Disposeを手動で呼び出して、フォームのすべてのコントロールにガベージコレクションのマークを付ける必要があります。

を使用してフォームを実際に表示した場合ShowDialog()、呼び出しによってフォームが破棄されることClose()はありません。あなたはまだそれを後で「再開」することができるかもしれません、そしておそらくあなたがしていることです。PreFilterMessage()最初に閉じたときに混乱したのではないかと思います。メッセージループがまだ機能しているかどうかを確認しましたか?または、実際に行う必要がありますthis.Visible = false;、またはControl.Hide

モードレスウィンドウとして表示されているフォームでCloseメソッドを呼び出すと、フォームのリソースがすでに解放されているため、Showメソッドを呼び出してフォームを表示することはできません。フォームを非表示にしてから表示するには、Control..::。Hideメソッドを使用します。

後で「再開」する必要があるためです。フォームが実際に破棄され、後で新しいインスタンスが表示されることを期待している場合は、閉じた後に手動でdisposeを呼び出します。

于 2008-10-24T03:27:09.323 に答える