Gestionnaire des tâches de fermeture est pas détecté deuxième fois dans une application WinForms
-
23-09-2019 - |
Question
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;
}
}
}
Alors, quand je veux fermer l'application en cliquant sur le bouton fermer la boîte de message est affiché comme il se doit, alors je choisis pas. Ensuite, la ligne e.Cancel = true est exécutée et la forme n'est pas fermée.
Maintenant, la chose est, après cela si je ferme l'application du gestionnaire de tâches est la raison pour laquelle près UserClosing !!! Pourquoi? Ça ne devrait pas être TaskManagerClosing?
La solution
J'ai trouvé un fil avec une réponse par notre propre nobugz :
Windows Forms ne peut pas détecter la proche raison est venue du Groupe Directeur. Donc, automatiquement se traduit par CloseReason.None à CloseReason.TaskManagerClosing. Le problème est, une fois que vous avez essayé de fermer avec le « X », le CloseReason est réglé à UserClosing et ne pas se réinitialiser Retour à Aucun si vous annulez la fin. Sloppy.
Et à côté de lui, une explication par un autre utilisateur sur la façon de changer la valeur de e.CloseReason à l'aide Aucune réflexion (car il est en lecture seule), de travailler autour de ce problème (cela devrait être appliqué lors de la mise e.Cancel True):
FieldInfo fi = typeof(Form).GetField("closeReason", BindingFlags.Instance | BindingFlags.NonPublic);
fi.SetValue(this, CloseReason.None);
Autres conseils
Voir la répondre à cette question qui utilise < a href = "http://msdn.microsoft.com/en-us/library/system.windows.forms.closereason.aspx" rel = "nofollow noreferrer"> CloseReason.TaskManagerClosing
pour attraper les mêmes.
Juste la traduction de votre code en 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