none
¿Es posible mostrar un ícono en el área de notificación sin que esté asociado a un formulario?

    Pregunta

  • Explico:

    Por ejemplo declarando un objeto de la clase NotifyIcon en el procedimiento Main() de manera que se ejecute sin abrir ningún formulario pero que a su vez el ícono se mantenga en el área de notificación hasta que termine explícitamente el programa, es posible eso?

    Entiendo que lo anterior se podría hacer ocultando el formulario, pero quisiera saber si se puede mostrar dicho ícono sin tener un formulario en memoria (aunque esté oculto).

    lunes, 31 de octubre de 2016 22:55

Respuestas

  • Si podrías, un camino es hacerlo a través del contexto de la aplicación.  

    1) Crea una clase publica basada en ApplicationContext

     public class MiContextoAplicacion : ApplicationContext
        {
            public MiContextoAplicacion()
            {
                NotifyIcon notifyIcon = new NotifyIcon();
                Icon icono = Icon.ExtractAssociatedIcon(@"C:\MiIcono.ico");
                notifyIcon.Icon = icono;
                notifyIcon.Visible = true;
            }
        }

    2) Modifica el metodo main en Program

    Application.Run(new MiContextoAplicacion());

    Saludos

    • Marcado como respuesta James-2016 martes, 1 de noviembre de 2016 16:52
    martes, 1 de noviembre de 2016 10:42
  • Notese que no te ahorras gran cosa haciendolo asi en lugar de basarte en un Form. El Form usa internamente el ApplicationContext para conectar a la bomba de mensajes, y supone una capa finisima por encima de este, y en el program.cs tienes que llamar al Application.Run para pasarle el ApplicationContext igual que tendrias que llamrlo con el Form, asi que la diferencia al final va a ser insignificante.
    • Marcado como respuesta James-2016 martes, 1 de noviembre de 2016 16:52
    martes, 1 de noviembre de 2016 11:32

Todas las respuestas

  • No, el NotifyIcon no funciona por sí solo. Hay que albergarlo dentro de un formulario porque éste es el que "engrana" con la bomba de mensajes de Windows y se los pasa al NotifyIcon cuando le corresponden, así que el NotifyIcon depende para su funcionamiento de esa infraestructura que le aporta el Form. Lo cual no quiere decir que el form tenga que ser visible en ningún momento, como aparentemente ya has descubierto, así que desde el punto de vista del usuario esa "infraestructura" puede hacerse invisible.
    martes, 1 de noviembre de 2016 7:53
  • Si podrías, un camino es hacerlo a través del contexto de la aplicación.  

    1) Crea una clase publica basada en ApplicationContext

     public class MiContextoAplicacion : ApplicationContext
        {
            public MiContextoAplicacion()
            {
                NotifyIcon notifyIcon = new NotifyIcon();
                Icon icono = Icon.ExtractAssociatedIcon(@"C:\MiIcono.ico");
                notifyIcon.Icon = icono;
                notifyIcon.Visible = true;
            }
        }

    2) Modifica el metodo main en Program

    Application.Run(new MiContextoAplicacion());

    Saludos

    • Marcado como respuesta James-2016 martes, 1 de noviembre de 2016 16:52
    martes, 1 de noviembre de 2016 10:42
  • Notese que no te ahorras gran cosa haciendolo asi en lugar de basarte en un Form. El Form usa internamente el ApplicationContext para conectar a la bomba de mensajes, y supone una capa finisima por encima de este, y en el program.cs tienes que llamar al Application.Run para pasarle el ApplicationContext igual que tendrias que llamrlo con el Form, asi que la diferencia al final va a ser insignificante.
    • Marcado como respuesta James-2016 martes, 1 de noviembre de 2016 16:52
    martes, 1 de noviembre de 2016 11:32
  • mm veo que hay alternativa pero por lo que leo no representa mayor ahorro de memoria.
    martes, 1 de noviembre de 2016 16:51
  • Gracias por el código, esa sería la alternativa, solo que por ahora programo en VB Net, creo que la cosa es similar, de todos modos gracias.
    • Marcado como respuesta James-2016 martes, 1 de noviembre de 2016 16:52
    • Desmarcado como respuesta James-2016 martes, 1 de noviembre de 2016 16:52
    martes, 1 de noviembre de 2016 16:52