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
Vous devez vous connecter pour publier un commentaire.
Similaire à ce que j'utilise.
Un simple flottant Clavier j'ai ajouté une touche de la galerie de l'interface. L'utilisateur a voulu aussi avoir mon clavier comme une application autonome sur leur ordinateur de bureau. J'ai donc fait cela, a créé un tiroir app pour elle. Maintenant - que si son esprit ouvert et de se lancer dans ma galerie?
Ils auraient deux claviers.
Sûr - l'utilisateur peut mettre fin à la première, mais sa plus simple d'y mettre fin. Il n'y a pas des répercussions de me tuer, si je ne. Mais l'Icône reste, comme en attente d'un événement. Pour contourner ce problème, j'ai actualiser la zone de Plateau.
Veuillez noter - Cela ne pouvait fonctionner que sur des paramètres Régionaux en anglais de l'Installation. Pour obtenir que cela fonctionne sur une autre langue, changer d'Utilisateur", Promu Zone de Notification", et la "Zone de Notification" à la traduction /chaîne équivalente.
L'utilisation de cet outil
http://www.codeproject.com/Articles/19620/LP-TrayIconBuster
Il parcourt ToolBarButtons dans TrayNotifyWnd & NotifyIconOverflowWindow et supprime ceux avec null noms de fichier.
Ne devrait pas être difficile de fermer l'instance en cours à l'aide de quelque chose comme des tuyaux, ou TCP si vous n'avez pas envie de le faire et ne sont pas en cours d'exécution .NET4.0.
Comme tout le monde le laisse sous-entendre, le problème est qu'en tuant vos processus, il n'obtiendrez pas une chance pour annuler l'enregistrement de son icône de barre d'état de l'instance, de sorte qu'il colle autour jusqu'à ce que Windows tente d'envoyer un événement (la prochaine fois que vous déplacez la souris au-dessus d'elle) a ce stade, Windows va le supprimer.
Selon ce programme d'installation que vous utilisez, cela pourrait être assez facile ou plus difficile. Plus populaire programme d'installation de cadres de permettre pour les plugins, et quelques-uns d'entre eux l'appui des Tuyaux, beaucoup plus de soutien requêtes TCP. Sinon, écrivez un petit exécutable de votre programme d'installation peut fonctionner avant qu'il commence le processus de désinstallation, qui communique avec votre application principale et envoie un message de fermeture.
Comme note finale, si vous pouvez utiliser .NET4.0 alors je vous suggère de regarder le construit dans le Système.IO.Les tuyaux de l'espace de noms et le classes.
J'ai trouvé ceci (http://maruf-dotnetdeveloper.blogspot.com/2012/08/c-refreshing-system-tray-icon.html) solution a fonctionné pour moi.