Domanda

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

Così, quando ho voglia di chiudere l'applicazione facendo clic sul pulsante di chiusura della finestra di messaggio viene visualizzato come dovrebbe, allora ho scelto no. Poi la linea e.Cancel = true viene eseguito e la forma non è chiuso.

Ora la cosa è, dopo questo se chiudo l'applicazione dal task manager stretta motivo è UserClosing !!! Perché? Non dovrebbe essere TaskManagerClosing?

È stato utile?

Soluzione

Ho trovato un filo con una risposta da parte nostra stessa nobugz :

  Forme

Windows non in grado di rilevare che il   vicino motivo è venuto dalla Task   Manager. Così è automaticamente   traduce CloseReason.None a   CloseReason.TaskManagerClosing.   Il problema è che, una volta che si è tentato di stretta   con la "X", il CloseReason è impostato   a UserClosing e non ottiene ripristino   indietro su Nessuno se si annulla la chiusura.   Sloppy.

E accanto ad essa, una spiegazione da un altro utente su come modificare il valore di e.CloseReason su Nessuno utilizzando Reflection (dal momento che è di sola lettura), al lavoro a questo problema (questo dovrebbe essere applicato quando si imposta e.Cancel true):

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

fi.SetValue(this, CloseReason.None);

Altri suggerimenti

Vedere la risposta a questa domanda che usi < a href = "http://msdn.microsoft.com/en-us/library/system.windows.forms.closereason.aspx" rel = "nofollow noreferrer"> CloseReason.TaskManagerClosing per catturare lo stesso.

Proprio la traduzione di codice 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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top