J'ai une application .NET 3.5 C # WinForms. Il n'y a pas d'interface graphique en tant que telle, juste un notificon avec un contextMenu.
J'ai essayé de définir le notificon à visible = Faux et jetez-le dans l'événement Application_exit, comme suit: P>
private void CheckForUpdate() { EventLogger.Instance.LogEvent("Checking for Update"); if (ApplicationDeployment.IsNetworkDeployed && ApplicationDeployment.CurrentDeployment.CheckForUpdate()) { EventLogger.Instance.LogEvent("Update available - updating"); ApplicationDeployment.CurrentDeployment.Update(); Application.Restart(); } }
7 Réponses :
Ce code fonctionne pour moi, mais je ne sais pas comment vous gardez votre application en vie, alors ... sans autre ado:
Parfois, l'événement Application_Exit peut être soulevé plusieurs fois
Juste mettre notificon = null; à la fin
En fait, maintenant que je pense à cela, je recommanderais d'utiliser cet événement pour cela, car il est possible d'avoir plusieurs boucles d'application.Run () en cours sur différents threads et ils déclencheront tous un événement de sortie pouvant faire disparaître votre icône. prématurément.
Totalement d'accord avec toi! Je préfère ne pas utiliser cet événement dans mes applications à des fins de nettoyage. Cependant, c'est la réponse la plus simple à la question "Pourquoi ce code jette une exception". Quant à mes idées Comment concevoir ce code d'une autre manière, je pourrais proposer de créer une classe jetable enveloppe autour de notificon, de sorte qu'il contrôlera la durée de vie du notificon. puis écrire en utilisant (nouvelle notificoncontroller ()) {application.run ()}; ou quelque chose comme ça
C'est ce que je fais dans WPF.
J'utilise ceci en conjonction à David Anson's minimiser l'application exemple de bac , ce qui vous permet de connecter une icône de bac à une fenêtre (vous Peut avoir plusieurs fenêtres ouvertes). p>
Il suffit d'ajouter ce code au constructeur pour minimisetotrayinstance code>. p>
Sur la fenêtre Fermer l'événement, cela a fonctionné pour moi. Sur App_exit, il jette une erreur lors de la mise en disposition de notificon.
juste envelopper dans un essais attraper et ignorer l'exception
Sous Windows 7, je devais également définir la propriété icon sur NULL. Sinon, l'icône est restée dans la fenêtre "Icônes cachées" du plateau après la fermeture de l'application. HTH quelqu'un.
// put this inside the window's class constructor Application.ApplicationExit += new EventHandler(this.OnApplicationExit); private void OnApplicationExit(object sender, EventArgs e) { try { if (trayIcon != null) { trayIcon.Visible = false; trayIcon.Icon = null; // required to make icon disappear trayIcon.Dispose(); trayIcon = null; } } catch (Exception ex) { // handle the error } }
Avez-vous remplacé la méthode d'élimination de l'objet où vous avez initialisé le notificon pour éliminer également le notificon?
protected override void Dispose(bool disposing) { if (disposing) { notifyIcon.Dispose(); notifyIcon = null; } base.Dispose(disposing); }
Ce code a fonctionné pour moi
Avant je suis désolé pour mon mauvais anglais. Si vous utilisez "fin" pour le programme de sortie. Ensuite, ne fermez pas l'icône de notification. Avant que vous fermez le notificon ultérieurement proche de la forme. vous devez utiliser moi.close () pour la fermeture de formulaire d'exécution
exemple
Son travail ... p> mais sa ne fonctionne pas p> ou uniquement p>