4
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    if (e.CloseReason == CloseReason.UserClosing)
    {
        if (MessageBox.Show(this, "Do you really want to close?", "Close?", 
                            MessageBoxButtons.YesNo) == DialogResult.No)
        {
            e.Cancel = true;
        }
    }
}

そのため、閉じるボタンをクリックしてアプリケーションを閉じたい場合、メッセージボックスが表示されるので、いいえを選択しました。次に、行 e.Cancel = true が実行され、フォームは閉じられません。

さて、この後、タスクマネージャーからアプリケーションを閉じると、閉じる理由は UserClosing です!!! なんで?TaskManagerClosing ではないでしょうか。

4

3 に答える 3

3

私たち自身のnobugzによる回答のあるスレッドを見つけました:

Windows フォームは、閉じる理由がタスク マネージャーからのものであることを検出できません。したがって、CloseReason.None が CloseReason.TaskManagerClosing に自動的に変換されます。問題は、「X」でクローズしようとすると、CloseReason が UserClosing に設定され、クローズをキャンセルしても None にリセットされないことです。ずさんな。

その隣には、この問題を回避するために (読み取り専用であるため) Reflection を使用して e.CloseReason の値を None に変更する方法に関する別のユーザーによる説明があります (これは、e.Cancel を True に設定するときに適用する必要があります)。 :

FieldInfo fi = typeof(Form).GetField("closeReason", BindingFlags.Instance | BindingFlags.NonPublic);

fi.SetValue(this, CloseReason.None);
于 2010-04-02T05:09:06.313 に答える
0

VB でのコードの翻訳のみ:

Imports System.Reflection
Private Sub ResetCloseReason()
  Dim myFieldInfo As FieldInfo
  Dim myType As Type = GetType(Form)
  myFieldInfo = myType.GetField("closeReason", BindingFlags.NonPublic Or _
                    BindingFlags.Instance Or BindingFlags.Public)
  myFieldInfo.SetValue(Me, CloseReason.None)

End Sub

于 2011-12-28T22:34:32.260 に答える
0

同じものをキャッチするために使用するこの質問への回答を参照してください。CloseReason.TaskManagerClosing

于 2010-04-02T05:19:12.013 に答える