Rafraîchissant système d'icônes par programmation

J'ai une application qui a une icône de plateau de système. Lors de la désinstallation je suis en tuant le processus si son exécution. Donc, comme ne suis pas gracieusement l'arrêt de l'application, l'icône reste dans la barre d'état système et de ne supprimer que si nous placez le pointeur de la souris sur elle. J'ai écrit un code qui ferait passer le curseur le long de la bac et obtenir le curseur en arrière dans sa position initiale. C'est ce que j'ai fait:

        [DllImport("user32.dll")]
        static extern IntPtr FindWindow(string className, string windowName);
        [DllImport("user32.dll")]
        static extern IntPtr FindWindowEx(IntPtr parent, IntPtr child, string className, string windowName);
        [DllImport("user32.dll")]
        static extern bool GetWindowRect(HandleRef handle, out RECT rct);

        [StructLayout(LayoutKind.Sequential)]
        struct RECT
        {
            public int Left;
            public int Top;
            public int Right;
            public int Bottom;
        }

        void RefreshTray()
        {
            IntPtr taskbar_Handle = FindWindow("Shell_Traywnd", "");
            IntPtr tray_Handle = FindWindowEx(taskbar_Handle, IntPtr.Zero, "TrayNotifyWnd", "");

            RECT rct;

            if (!(GetWindowRect(new HandleRef(null, tray_Handle), out rct)))
            {
            }

            System.Drawing.Point init = Control.MousePosition;

            for (int i = rct.Left; i < rct.Right-20; i++)
            {
                Cursor.Position = new System.Drawing.Point(i, (rct.Bottom + rct.Top) / 2);
            }

            Cursor.Position = init;
         }

Cela fonctionne bien dans tous les cas sauf lorsque l'option "ne pas afficher les icônes de notification" est activé. Est-il une manière que je pourrais actualiser le plateau dans ce cas?

MODIFIER
Comme les commentaires ont suggéré que j'ai changé mon approche. Au lieu de tuer le plateau de l'application, j'ai établi une communication entre mon service d'application (ouais, j'ai oublié de mentionner, j'ai un service à trop courir le long de avec l'application) et le bac de l'application. Lors de la désinstallation, j'ai arrêter le service, à partir de l'arrêt du service méthode je voudrais envoyer un socket message d'un format particulier pour le bac de l'application et de lui demander de fermer et je mettrais le notifier à l'icône de la visibilité à faux. Cela laisserait le Plateau Application en cours d'exécution en arrière-plan, donc je suis en utilisant "taskkill" pour supprimer l'application. Il a bien fonctionné dans Win7 et Vista, mais ne fonctionne pas correctement sous Win XP. Mais je n'ai pas écrit d'environnement code spécifique. Possible idée?

  • Ainsi, j'ai eu une situation similaire une fois. Ce que j'ai fait a été éliminé le composant NotifyIcon dans le Form_Closing de l'événement et il a bien fonctionné.
  • Moins hacky peut-être d'avoir un moyen de communiquer avec votre application, à partir de l'utilitaire de désinstallation. (bien que je n'ai pas de connaissances dans ce domaine)
  • Vous ne voulez pas écrire du code comme ceci. Ne tuez pas, demandez gentiment.
  • Ne pas interrompre le processus. Demander la fermeture. Il n'y a absolument aucun point de l'écriture du code ci-dessus.
  • merci les gars! ferait fermer l'application.
  • Form_Closing n'est pas déclenché lorsque l'application est tué. ne fonctionne pas pour moi au moins

InformationsquelleAutor Niranjan | 2011-12-01