2009-10-24 15 views
9

Me refiero a cuando el usuario inicia mi aplicación (exe). Quiero que comience directamente en la bandeja del sistema, sin mostrar la ventana. Como softwares antivirus & gestores de descargas, que se inician y ejecutan en la bandeja del sistema de forma silenciosa.¿Cómo iniciar la aplicación directamente en la bandeja del sistema? (.NET C#)

Quiero el mismo efecto y cuando el usuario hace clic en el botón "mostrar" del contextmenustrip de notifyIcon, solo la aplicación debe mostrar la GUI.

estoy usando esto, pero no su trabajo

private void Form_Load(object sender, EventArgs e) 
    { 
     this.Hide(); 
    } 

Puede ser que tenga que tener una función principal() de alguna otra clase que no tiene interfaz gráfica de usuario, pero tiene NotifyIcon & ContextMenuStrip cuya opción va a crear una instancia de la interfaz gráfica de usuario clase de ventana. ¿Derecha?

+0

Consulte también esta pregunta - http://stackoverflow.com/questions/807005/c-net-winforms-instantiate-a-form-without-showing-it – ChrisF

+0

Perdón por sacar un viejo tema. Tengo todo excepto una cosa importante. Entiendo que 'Application.Run()' esencialmente renuncia al control (?). Lo que quiero hacer es tener código haciendo algo sin interacción del usuario (digamos que está procesando datos y escribiéndolo en un archivo). ¿Dónde colocaría este código para que se ejecute mientras el programa se encuentra en la bandeja del sistema? –

+0

@BarryDysert: 'Aplicación.Run() 'inicia la bomba de mensajes de Windows. Si no tiene esta llamada en algún lugar, entonces el icono de la bandeja no funcionará en absoluto. Sin saber nada acerca de lo que realmente estás tratando de lograr, diría que para ver los hilos, solo ten en cuenta los problemas que modifican las cosas de la interfaz de usuario en los hilos que no sean el que se llamó desde 'Application.Run()'. –

Respuesta

27

La forma en que normalmente configuración algo como esto es modificar el Program.cs a ser algo como lo siguiente :

[STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 

     using (NotifyIcon icon = new NotifyIcon()) 
     { 
      icon.Icon = System.Drawing.Icon.ExtractAssociatedIcon(Application.ExecutablePath); 
      icon.ContextMenu = new ContextMenu(new MenuItem[] { 
       new MenuItem("Show form", (s, e) => {new Form1().Show();}), 
       new MenuItem("Exit", (s, e) => { Application.Exit(); }), 
      }); 
      icon.Visible = true; 

      Application.Run(); 
      icon.Visible = false; 
     } 
    } 

uso de este, usted no tiene que preocuparse acerca de cómo ocultar en lugar de formas de cierre y todo el resto de los cortes que pueden conducir a ... usted puede hacer una forma demasiado Singleton en lugar de crear instancias de un nuevo Form cada t Si hace clic en la opción mostrar formulario. Esto es algo de lo que construir, no la solución final.

+1

Como nota adicional, debe utilizar un proyecto de GUI, a pesar de que este código aparece antes de que aparezca la GUI, de lo contrario, aparecerá una ventana de la consola emergente, ¡que es incluso peor que el problema original! –

+0

¡Impresionante! Esto es exactamente lo que estoy buscando. ¿Pero cómo cambio el ícono. Ícono? Quiero poner mi propio * .ico aquí. en lugar de extraer uno. – claws

+1

'nuevo System.Drawing.Icon (" C: \ Path \ To \ Icon.ico ")' de la memoria, o use un recurso (recomendado). Consulte esta otra pregunta para obtener detalles sobre cómo crear/usar recursos: http://stackoverflow.com/questions/90697/how-to-create-and-use-resources-in-c-net-vs-2008 –

3

También debe configurar el icono de notificación.

ya sea manualmente o por medio de la barra de herramientas (arrastrar un NotifyIcon en su forma) crear la NotifyIcon:

this.notifyIcon = new System.Windows.Forms.NotifyIcon(components); 

A continuación, agregue este código para Form_Load():

// Notify icon set up 
notifyIcon.Visible = true; 
notifyIcon.Text = "Tooltip message here"; 
this.ShowInTaskbar = false; 
this.Hide(); 

A pesar de esta voluntad, como ha sido señalado, muestre brevemente el formulario antes de ocultarlo.

De la respuesta aceptada de this question, la solución parece ser la de cambiar:

Application.Run(new Form1()); 

a:

Form1 f = new Form1(); 
Application.Run();   

en Main().

+0

En realidad, tengo la configuración notifyIcon. Entonces, acabo de agregar el this.ShowInTaskbar = false; pero el problema es que la ventana se muestra por un instante y luego se oculta. No quiero esto – claws

+0

Echa un vistazo a mi solución y luego claws. Esto solucionará este problema. –

+0

¿Ha intentado configurar 'WindowState' en' Minimized'? – ChrisF

0

¿Has creado una aplicación de Windows en C#? Debe arrastrar un control NotifyIcon en el formulario, el control se colocará debajo del formulario porque no tiene representación visual en el formulario.

A continuación, establezca sus propiedades como el icono ...

primero pruebe éste ...

Cuestiones relacionadas