2010-09-17 31 views
1

J'écris un programme qui ne crée aucune forme jusqu'à ce que l'on en ait besoin. Le problème est, il empêche la fermeture de continuer automatiquement. J'ai vu discussions sur l'ajout d'un if pour former des événements de clôture pour vérifier si elle est due à l'arrêt, mais comme je l'ai dit, mon programme est destiné à ne pas avoir de formulaires du tout jusqu'à ce que requis.Obtenir un programme C# sans forme pour se fermer pendant l'arrêt/le redémarrage?

Y at-il un événement ou une autre méthode qui me permettra de savoir quand mon programme devrait se fermer pour permettre à Windows de se fermer automatiquement? And it's not multithreaded.

Répondre

4

Vous pouvez utiliser la classe SystemEvents pour «écouter» les utilisateurs qui se déconnectent ou qui se ferment.

Si je comprends bien la documentation (et une étude approfondie avec réflecteur confirme):

  • Les SystemEvents se frayer un nouveau thread qui reçoit les messages des fenêtres (il a son propre messagepump).
  • Lorsqu'un événement est reçu, votre code sera appelé à partir du nouveau thread. Vous devriez être conscient de cela.
+0

De l'apparence des choses, vous devez toujours avoir une forme cachée ouverte (ou que vous avez démarré la pompe de message à la main) pour que cela travailler cependant. –

+0

@Damien_The_Unbeliever - Si c'est vrai, ça a l'air idiot. – unrelativity

+0

@ a2h - Peut-être, mais regardez l'exemple 2 sur cette page http://msdn.microsoft.com/en-us/library/microsoft.win32.systemevents.aspx. Maintenant, il parle d'un service Windows. Mais ce n'est qu'un autre exemple est une application de formulaires qui a un formulaire ouvert. Et (à partir d'un peu de programmation Windows old school), sachant que ces événements sont livrés via des messages Windows, ce n'est pas tout à fait inattendu. –

1

Vous pouvez toujours ajouter un formulaire factice que vous ouvrez minimisé, sans icône dans la barre des tâches - il n'aura aucun impact visuel, mais recevra l'événement de fermeture de formulaire - où vous pourriez noter l'événement shutdown, et probablement arrêté/arrêter tout ce que votre application est en train de faire.

1

Gestion de l'événement Microsoft.Win32.SystemEvents.SessionEnding, et vérifier si elle est un arrêt réel avec System.Environment.HasShutdownStarted