Tengo una aplicación que tiene un icono de bandeja del sistema. Mientras desinstalo estoy matando el proceso si se está ejecutando. Entonces, como no estoy deteniendo la aplicación, el ícono permanece en la bandeja del sistema y se eliminará solo si colocamos el mouse sobre él. Escribí un código que corría el cursor a lo largo de la bandeja y devolvía el cursor a su posición inicial. Esto es lo que he hecho:Actualizando iconos de la bandeja del sistema programáticamente
[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;
}
Esto funciona bien en todos los casos, excepto cuando la opción "No mostrar los iconos de notificación" está activado. ¿Hay alguna manera de que pueda actualizar la bandeja en este caso?
EDIT Como sugerí los comentarios, cambié mi enfoque. En lugar de matar la aplicación de la bandeja, establecí una comunicación entre mi servicio de aplicación (sí, olvidé mencionar, también tengo un servicio que se ejecuta junto con la aplicación) y la aplicación de la bandeja. Durante la desinstalación, detengo el servicio, desde el método de parada de servicio envié un mensaje de socket de un formato particular a la aplicación de bandeja y solicité que se cerrara y establecía la visibilidad del icono de notificación como falsa. Esto dejaría la aplicación de la bandeja ejecutándose en segundo plano, así que estoy usando "taskkill" para eliminar la aplicación. Funcionó bien en Win7 y Vista, pero no funciona correctamente en Win XP. Pero no he escrito ningún código específico del entorno. ¿Alguna pista posible?
Bueno, una vez tuve una situación similar. Lo que hice fue deshacerse del componente NotifyIcon en el evento Form_Closing y funcionó bien. –
Una forma menos hacky podría ser tener una forma de comunicarse con su aplicación, desde el desinstalador. (aunque no tengo conocimiento en esta área) –
No desea escribir código como este. No mates, pregunta amablemente. –