Frage

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;
        }
    }
}

Also, wenn ich möchte, die Anwendung schließen Sie die Schließen-Schaltfläche klicken, das Meldungsfeld, wie es sollte gezeigt wird, dann habe ich nicht. Dann wird die Linie e.Cancel = true wird ausgeführt und das Formular geschlossen wird nicht.

Nun ist die Sache, danach, wenn ich die Anwendung von Task-Manager schließen die enge Grund ist UserClosing !!! Warum? Sollte es nicht TaskManagerClosing sein?

War es hilfreich?

Lösung

fand ich einen Thread mit einer Antwort von unserem eigenen nobugz :

  

Windows Forms kann nicht erkennen, dass die   schließen Grund kam von der Aufgabe   Manager. So ist es automatisch   übersetzt CloseReason.None zu   CloseReason.TaskManagerClosing.   Das Problem ist, wenn Sie zu schließen versucht   mit dem „X“ ist der Satz CloseReason   zu UserClosing und nicht zurückgesetzt bekommt   zurück auf Keine, wenn Sie die Nähe abzubrechen.   Sloppy.

Und daneben, eine Erklärung von einem anderen Benutzer auf, wie e.CloseReason Wert auf Keine Verwendung von Reflexion zu ändern (da es schreibgeschützt ist), zu arbeits, um dieses Problem (dies soll angewandt werden, wenn e.Cancel Einstellung Wahr):

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

fi.SetValue(this, CloseReason.None);

Andere Tipps

Sehen Sie die Antwort auf diese Frage, die verwendet < a href = "http://msdn.microsoft.com/en-us/library/system.windows.forms.closereason.aspx" rel = "nofollow noreferrer"> CloseReason.TaskManagerClosing gleich zu fangen.

Nur die Übersetzung von Code in 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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top