2008-09-05 17 views
59

¿Cuál es la forma correcta de minimizar una aplicación WinForms en la bandeja del sistema?¿Cuál es la forma correcta de minimizar la bandeja de una aplicación C# WinForms?

Nota: minimizar a bandeja del sistema; en el lado derecho de la barra de tareas por el reloj. No estoy preguntando sobre minimizar a la barra de tareas, que es lo que sucede cuando presionas el botón "menos" en la ventana.

He visto soluciones piratas como, "minimizar, establecer ShowInTaskbar = false, luego mostrar su NotifyIcon".

Las soluciones como esa son hackish porque la aplicación no parece minimizar a la bandeja como otras aplicaciones, el código tiene que detectar cuándo establecer ShowInTaskbar = true, entre otros problemas.

¿Cuál es la forma correcta de hacerlo?

+1

Podría dar la nombre de una aplicación de muestra que hace lo que estás buscando. Realmente no creo que haya una manera "adecuada" de hacerlo, ya que de todos modos no se deberían minimizar las aplicaciones al área de notificación. – Navaar

+1

Quizás usted y yo usemos una terminología diferente. Estoy hablando del área en la bandeja del sistema donde aplicaciones como WinRar, Vuze, Witty, Folding @ Home, etc. minimizan y/o muestran información. –

+0

¡Hola Judah! Estaba mirando la animación en mi sistema Windows 7 Ent (x64) cuando minimicé algunas aplicaciones en la bandeja. Parece que todos los que revisé utilizan la animación de cierre. Si miras detenidamente, se reducen a nada. Comprobé Skype y MS Office Communicator. Ambos usan la animación cercana. También revisé Miranda Portable, pero no anima en absoluto. ¿Puede indicarme una aplicación que realmente anime a la bandeja? De todos modos, en base a lo que vi, parece que deberías cerrar tu formulario y mantener vivo el hilo, que se describe en la publicación de FlySwat. – alwayssummer

Respuesta

18

En realidad no hay manera logrado hacer que la forma de animación a la bandeja en winforms nativos, sin embargo se puede P/Invoke shell32.dll hacerlo:

buena información aquí (en el comentarios no el post):

http://blogs.msdn.com/jfoscoding/archive/2005/10/20/483300.aspx

Y aquí es en C++:

http://www.codeproject.com/KB/shell/minimizetotray.aspx

Puedes usar eso para descubrir qué cosas pintar para tu versión C#.

+0

P/Invoke no es "hackish?" Es más hackish que usar alguna forma incorporada para hacer esto. :) – bugfixr

+6

Llamar a la API de Win32 correcta no es hackish. Simplemente significa que los diseñadores de la biblioteca de la clase base de .NET framework omitieron esta área, no lo consideraron lo suficientemente importante como para envolverlo ellos mismos. –

8
this.WindowState = FormWindowState.Minimized 

Esa es la forma de hacerlo y me parece bien la mayor parte del tiempo. El único momento en que tiene cierta rareza es si lo llamas al inicio, lo que a veces tiene cierta rareza, por lo que la mayoría de las personas también establecerán ShowInTaskbar = false y también ocultarán el formulario.

http://msdn.microsoft.com/en-us/library/system.windows.forms.form.windowstate.aspx

+1

Ryan, que lo minimiza en la barra de tareas, no en la bandeja del sistema. Si además llama a ShowInTaskbar = false, se entra en el escenario de hackeo descrito en la publicación. Quiero que realmente se minimice en la bandeja del sistema. P.ej. si minimizo, quiero que Windows muestre que está minimizando a la bandeja del sistema, no a la barra de tareas o al menú de inicio. La mayoría de las aplicaciones que minimizan a la bandeja hacen esto bien; Windows dibuja la ventana minimizando a la bandeja del sistema. ¿Cómo lo están haciendo? –

3

Actualización: Parece que he publicado antes de tiempo. También estaba usando el siguiente truco para una herramienta mía. Esperando la solución correcta para esto ..........

Puede usar Windows.Forms.NotifyIcon para esto. http://msdn.microsoft.com/en-us/library/system.windows.forms.notifyicon.aspx

Agregue NotifyIcon a la forma, establezca algunas propiedades y listo.

 this.ShowIcon = false;//for the main form 
     this.ShowInTaskbar = false;//for the main form 
     this.notifyIcon1.Visible = true;//for notify icon 
     this.notifyIcon1.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon1.Icon")));//set an icon for notifyicon 

    private void Form1_Shown(object sender, EventArgs e) 
    { 
     this.Hide(); 
    } 
+1

Gulzar, su código es exactamente el escenario de hackish que describí en la publicación. ¿Hay una mejor manera? Estoy buscando un * real * minimizar a la bandeja, no este "mostrar icono de notificación y no ShowInTaskbar" hackear. –

-1

En el constructor de la forma:

this.Resize += new EventHandler(MainForm_Minimize); 

A continuación, utilice este método de controlador de eventos:

private void MainForm_Minimize(object sender, EventArgs e) 
    { 
     if(this.WindowState == FormWindowState.Minimized) 
      Hide(); 
    } 
+0

estructurado, eso no es lo que estoy buscando.Intento que la aplicación se minimice para intentar, usando la animación de XP/Vista que muestra que va a la bandeja. –

1

similar al anterior ...

Tengo un controlador de eventos de cambio de tamaño que se activa cada vez que se cambia el tamaño de la ventana (maximizada, minimizada, etc.) ...

public form1() 
    { 
     Initialize Component(); 

     this.Resize += new EventHanlder(form1_Resize); 
    } 


    private void form1_Resize(object sender, EventArgs e) 
    { 
     if (this.WindowState == FormWindowState.Minimized && minimizeToTrayToolStripMenuItem.Checked == true) 
     { 
      NotificationIcon1.Visible = true; 
      NotificationIcon1.BalloonTipText = "Tool Tip Text" 
      NotificationIcon1.ShowBalloonTip(2); //show balloon tip for 2 seconds 
      NotificationIcon1.Text = "Balloon Text that shows when minimized to tray for 2 seconds"; 
      this.WindowState = FormWindowState.Minimized; 
      this.ShowInTaskbar = false; 
     } 
    } 

Esto permite al usuario seleccionar si desean o no a reducir al mínimo bandeja a través de una barra de menú. Pueden ir a Windows -> y hacer clic en Minimizar a la bandeja. Si esto está marcado, y la ventana está cambiando de tamaño a Minimizado, entonces se reducirá a la bandeja. Funciona sin problemas para mí.

+0

Kevin, creo que malinterpretaste mi pregunta. Estoy preguntando por la forma correcta de minimizar. Por "apropiado", me refiero a que Windows reproduzca la animación de minimización de bandeja para su ventana, ya que está minimizada. Su solución juega el estándar "minimizar a la barra de tareas", y luego la ficha de la barra de tareas desaparece. –

-1

Si usted está teniendo problemas para conseguir que esto funcione, compruebe que tiene

this.Resize += new System.EventHandler(this.Form1_Resize); 

en los fom1.designer.cs

5

Será de ayuda,

public partial class Form1 : Form 
    { 
     public static bool Close = false; 
     Icon[] images; 
     int offset = 0; 


     public Form1() 
     { 
      InitializeComponent(); 

      notifyIcon1.BalloonTipText = "My application still working..."; 
      notifyIcon1.BalloonTipTitle = "My Sample Application"; 
      notifyIcon1.BalloonTipIcon = ToolTipIcon.Info; 
     } 

     private void Form1_Resize(object sender, EventArgs e) 
     { 
      if (FormWindowState.Minimized == WindowState) 
      { 
       this.Hide(); 
       notifyIcon1.ShowBalloonTip(500); 
       //WindowState = FormWindowState.Minimized; 
      } 


     } 

     private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e) 
     { 
      this.Show(); 
      notifyIcon1.ShowBalloonTip(1000); 
      WindowState = FormWindowState.Normal; 

     } 

     private void maximizeToolStripMenuItem_Click(object sender, EventArgs e) 
     { 

      this.Show(); 
      WindowState = FormWindowState.Normal; 
     } 

     private void closeToolStripMenuItem_Click(object sender, EventArgs e) 
     { 
      Close = true; 
      this.Close(); 
     } 



     // Handle Closing of the Form. 
     protected override void OnClosing(CancelEventArgs e) 
     { 
      if (Close) 
      { 
       e.Cancel = false; 
      } 
      else 
      { 

       WindowState = FormWindowState.Minimized; 
       e.Cancel = true; 
      } 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      // Load the basic set of eight icons. 
      images = new Icon[5]; 
      images[0] = new Icon("C:\\icon1.ico"); 
      images[1] = new Icon("C:\\icon2.ico"); 
      images[2] = new Icon("C:\\icon3.ico"); 
      images[3] = new Icon("C:\\icon4.ico"); 
      images[4] = new Icon("C:\\icon5.ico"); 
     } 


     private void timer1_Tick(object sender, EventArgs e) 
     { 
      // Change the icon. 
      // This event handler fires once every second (1000 ms). 
      if (offset < 5) 
      { 
       notifyIcon1.Icon = images[offset]; 
       offset++; 
      } 
      else 
      { 
       offset = 0; 
      } 
     } 

    } 
+0

Ese es el truco del que estoy hablando. En realidad, no se está minimizando a la bandeja (minimiza a la barra de tareas) e implica un código de hack para mostrar/ocultar el ícono de la barra de tareas. –

Cuestiones relacionadas