Comment éviter de laisser une icône dans la zone de notification à la sortie?

StackOverflow https://stackoverflow.com/questions/1627151

  •  06-07-2019
  •  | 
  •  

Question

Mon programme place une icône dans la barre d'état système car l'utilisateur peut la minimiser. Toutefois, si l'application se bloque ou si j'empêche l'application de s'exécuter sous VS, elle y laisse l'icône jusqu'à ce que je la survole avec la souris. Parfois, je regarde en bas et il y aura une dizaine d'icônes.

Puis-je m'assurer que l'icône disparaît?

Était-ce utile?

La solution

Il n'y a aucun moyen de faire cela. Windows n'interroge pas votre programme pour savoir s'il est toujours actif. Par conséquent, votre icône restera dans la barre d'état système jusqu'à ce que vous lui demandiez de quitter (sortie normale) ou que l'utilisateur fasse quelque chose qui initie un appel vers votre programme (par exemple, passer la souris). Alors seulement, le shell sait que votre programme est mort et qu'il doit nettoyer votre icône.

Autres conseils

Vous avez plusieurs options:

1) Ecrivez un gestionnaire d'exceptions structuré racine garantissant la destruction de l'icône avant de quitter. Celui-ci demande quelques efforts, mais vous pouvez en principe ajouter votre propre gestionnaire d’exception non géré à Windows, qui sera appelé dans le cas de nombreuses formes de "boom". ce qui vous permettra alors une opportunité de nettoyage ultime.

2) Ecrivez une application de moniteur qui dort sur le traitement de votre processus principal et supprime l'icône lorsqu'elle se réveille (l'application principale est morte). Pour que ce dernier scénario fonctionne correctement, vous souhaiterez probablement que le processus principal NE tue PAS l'icône elle-même. Vous pouvez également créer un moyen d'indiquer à l'application du moniteur qu'elle doit quitter sans détruire l'icône (laissez cette application en veille). sur le descripteur de processus et sur un événement nommé - et s'il est réveillé par l'événement, il meurt simplement sans nettoyage après l'application principale).

Avant de quitter, définissez la propriété NotifyIcon Visible sur false.

Vous devez appeler Dispose sur NotifyIcon pour que celui-ci quitte le bac.

EDIT: Il existe un événement auquel vous pouvez participer dans votre Program.cs. Pour toutes les applications Windows, vous obtiendrez quelque chose comme ceci:

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }

La classe Application comporte quelques événements dont vous pouvez tirer parti pour savoir quand votre application meurt:

        Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
        Application.ApplicationExit += new EventHandler(Application_ApplicationExit);

Nous pouvons masquer trayIcon avant la fermeture du formulaire. Ajouter un événement FormClosing

NotifyIcon ni;
...
...
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
     ni.Visible = false;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top