Task manager vicino non viene rilevata la seconda volta in un WinForms applicazione
-
23-09-2019 - |
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?
Soluzione
Ho trovato un filo con una risposta da parte nostra stessa nobugz :
FormeWindows 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