2010-04-02 5 views
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; 
     } 
    } 
} 

Donc, quand je veux fermer l'application en cliquant sur le bouton de fermeture, la boîte de message s'affiche comme il se doit, alors j'ai choisi non. Ensuite, la ligne e.Cancel = true est exécutée et le formulaire n'est pas fermé.La fermeture du gestionnaire de tâches n'est pas détectée une deuxième fois dans une application WinForms

Maintenant, la chose est, après cela, si je ferme l'application du gestionnaire de tâches la raison proche est UserClosing !!! Pourquoi? Ne devrait-il pas être TaskManagerClosing?

+0

OMG, j'ai été tout à fait capable de reproduire ceci: Si TaskManager essaie de fermer la forme après une UserClosing a été annulée, la fermeture de la TaskManager La tentative est transmise avec UserClosing comme CloseReason, au lieu de TaskManagerClosing comme d'habitude. Est-ce un bug? Est-ce que ce comportement est attendu? Bonne question, +1! –

Répondre

2

J'ai trouvé un thread avec une réponse par notre propre nobugz:

Windows Forms ne peut pas détecter la raison étroite est venue du Gestionnaire des tâches . Donc automatiquement traduit CloseReason.None à CloseReason.TaskManagerClosing. Problème, une fois que vous avez essayé de fermer avec le "X", le CloseReason est défini à UserClosing et ne réinitialise pas à Aucun si vous annulez la fermeture. Sloppy.

Et à côté de lui, une explication par un autre utilisateur sur la façon de changer la valeur de e.CloseReason à Aucun utilisant la 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); 
+0

Cela fonctionne. Génial. – Samir

0

Voir la answer à cette question qui utilise CloseReason.TaskManagerClosing pour attraper le même.

+0

Le code dans le lien détecte si la fermeture est due à un clic sur un bouton ou à un clic sur le bouton Windows x. L'utilisation d'une propriété bool pour détecter est correcte ici. Mais comment détecter la fermeture de TaskManager? – Samir

0

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

Questions connexes