はい、可能です。 Application.Exit()メソッドは、OnFormClose()メソッドを呼び出すようにApplication.OpenFormsコレクションのフォームを繰り返します。 Winformsには、そのコレクションがオープンフォームを追跡できないバグがあります。このコードはそれを示しています:
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
protected override void OnHandleCreated(EventArgs e) {
// Set breakpoint here:
base.OnHandleCreated(e);
}
protected override void OnMouseDown(MouseEventArgs e) {
this.ShowInTaskbar = !this.ShowInTaskbar;
MessageBox.Show(string.Format("There are {0} open forms", Application.OpenForms.Count));
Application.Exit();
}
protected override void OnFormClosing(FormClosingEventArgs e) {
MessageBox.Show("you won't see this");
base.OnFormClosing(e);
}
}
フォームをクリックすると、バグが発生します。どのようにそれが0の開いたフォームを報告し、OnFormClosingで表示されたメッセージボックスを見たことがないことに注意してください。
ShowInTaskbarプロパティに割り当てられます。このようなプロパティがいくつかありますが、NotifyIconを使用しているときに使用する可能性があるため、ShowInTaskbarを選択しました。 RightToLeftは別のものです。これらのプロパティは、ネイティブのCreateWindowEx()API関数を使用してウィンドウを作成した場合にのみ指定できるため、特殊です。それらを変更するには、Winformsがかなり英雄的な何かをする必要があります、それはウィンドウを破壊し、それを再作成します。残念なことにこれもバグを引き起こし、ウィンドウを破壊するとOpenFormsコレクションからフォームが削除され、それを元に戻すことは忘れてしまいます。
OnHandleCreated()メソッドをこのスニペットからフォームにコピー/ペーストし、ブレークポイントを設定します。ウィンドウが最初に作成されると、それは一度トリガーする必要があります。それが再びトリガされ、バグのシナリオが呼び出されると、呼び出しスタックを調べて、クラス内のどのコードがトリガされたかを確認できます。そのコードを無効にして、別の方法でコードを実行する必要があります。コンストラクターでShowInTaskbarプロパティーを設定しても問題ありませんが、Loadイベントハンドラーのように、ウィンドウが作成された後に割り当てられた場合にのみ問題になります。
'ShowInTaskbar = false;'のとき、 'Application.Exit()'は通常はそうであるときに 'FormClosing'イベントをトリガーしませんでした。 –