2008-09-05 9 views
59

Quelle est la bonne façon de minimiser une application WinForms à la barre d'état système?Quelle est la bonne façon de minimiser pour ramasser une application C# WinForms?

Remarque: réduire à barre d'état système; sur le côté droit de la barre des tâches par l'horloge. Je ne parle pas de la réduction à la barre des tâches, ce qui se passe lorsque vous cliquez sur le bouton "moins" de la fenêtre.

J'ai vu des solutions hackish comme, "minimiser, définir ShowInTaskbar = false, puis afficher votre NotifyIcon."

Des solutions comme celles-ci sont hackish parce que l'application ne semble pas se réduire au plateau comme les autres applications, le code doit détecter quand régler ShowInTaskbar = true, entre autres problèmes.

Quelle est la bonne façon de faire cela?

+1

Pouvez-vous fournir la nom d'un exemple d'application qui fait ce que vous cherchez. Je ne pense vraiment pas qu'il existe un moyen "approprié" de le faire puisque vous ne devriez pas vraiment minimiser les applications dans la zone de notification. – Navaar

+1

Peut-être que vous et moi utilisons une terminologie différente. Je parle de la zone dans la barre d'état système où des applications telles que WinRar, Vuze, Witty, Folding @ Home, etc. minimisent et/ou affichent des informations. –

+0

Salut Judah! Je regardais à l'animation dans mon système Windows 7 Ent (x64) quand je minimisais quelques applications sur le plateau. Il semble que tous ceux que j'ai vérifiés utilisent l'animation proche. Si vous regardez attentivement, ils rétrécissent à rien. j'ai vérifié Skype et MS Office Communicator. Ils utilisent tous deux l'animation rapprochée. J'ai également vérifié Miranda Portable, mais il ne s'anime pas du tout. Pouvez-vous me pointer vers une application qui anime réellement sur le plateau? Quoi qu'il en soit, d'après ce que j'ai vu il semble que vous devriez juste fermer votre forme et de garder le fil vivant, qui est décrit dans le poste de FlySwat. – alwayssummer

Répondre

18

Il n'y a en fait aucun moyen réussi à le faire sous forme d'animation sur le plateau en WinForms natif, mais vous pouvez P/Invoke shell32.dll de le faire:

Quelques bonnes infos ici (dans le commentaires sur le poteau):

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

Et ici, il est en C++:

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

Vous pouvez l'utiliser pour déterminer ce que Pinvoke doit contenir pour votre version C#.

+0

P/Invoke n'est pas "hackish?" C'est plus hackish que d'utiliser un moyen intégré pour le faire. :) – bugfixr

+6

L'appel de l'API Win32 correcte n'est pas hackish. Cela signifie simplement que les concepteurs de la bibliothèque de classes de base .NET Framework ont ​​manqué ce domaine, ne l'ont pas jugé assez important pour envelopper eux-mêmes. –

8
this.WindowState = FormWindowState.Minimized 

C'est la méthode intégrée pour le faire et ça me va très bien la plupart du temps. La seule fois où il y a quelque chose de bizarre, c'est que si vous l'appelez au démarrage, il y a parfois de l'étrangeté, c'est pourquoi la plupart des gens vont aussi définir ShowInTaskbar = false et cacher le formulaire aussi.

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

+1

Ryan, qui le minimise à la barre des tâches, pas la barre d'état système. Si vous appelez en plus ShowInTaskbar = false, vous entrez dans le scénario hackish décrit dans la publication. Je veux que cela minimise réellement à la barre d'état système. Par exemple. Si je minimise, je veux que Windows montre qu'il minimise dans la barre d'état système, pas dans la barre des tâches ou dans le menu Démarrer. La plupart des applications qui minimisent le plateau le font très bien; Windows dessine la fenêtre en minimisant la barre d'état système. Comment le font-ils? –

3

Mise à jour: On dirait que j'ai posté trop tôt. J'utilisais aussi le hack ci-dessous pour un de mes outils. En attente de la bonne solution pour cela ..........

Vous pouvez utiliser Windows.Forms.NotifyIcon pour cela. http://msdn.microsoft.com/en-us/library/system.windows.forms.notifyicon.aspx

Ajoutez NotifyIcon au formulaire, définissez certaines propriétés et vous avez terminé.

 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, votre code est exactement le scénario hackish que j'ai décrit dans le post. Y a-t-il un meilleur moyen? Je suis à la recherche d'un * vrai * réduisent au minimum, pas « montrer icône Notify et ne ShowInTaskBar » hack. –

-1

Dans le constructeur du formulaire:

this.Resize += new EventHandler(MainForm_Minimize); 

utiliser cette méthode de gestionnaire d'événements:

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

Structuré, ce n'est pas ce que je cherche.J'essaie d'obtenir l'application à minimiser pour essayer, en utilisant l'animation XP/Vista qui montre aller dans le bac. –

1

similaires comme ci-dessus ...

J'ai un gestionnaire d'événements de modification de taille qui se déclenche chaque fois que la fenêtre se redimensionnée (maximisée, réduite au minimum, 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; 
     } 
    } 

Ceci permet à l'utilisateur de choisir si oui ou non ils veulent réduire au minimum plateau via une barre de menu. Ils peuvent aller à Windows -> et cliquer sur Réduire au plateau. Si cette case est cochée, et que la fenêtre est redimensionnée sur Réduite, elle sera réduite au niveau du bac. Fonctionne parfaitement pour moi.

+0

Kevin, je pense que vous avez mal compris ma question. Je demande la bonne façon de minimiser. Par "correct", je veux dire que Windows a pour effet de minimiser l'animation de la fenêtre de votre fenêtre. Votre solution lit la barre "Réduire à la tâche" standard, puis la mosaïque de la barre des tâches disparaît. –

-1

Si vous rencontrez des problèmes pour obtenir que cela fonctionne, vérifiez que vous avez

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

dans les fom1.designer.cs

5

Il sera Helps,

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

C'est le hack dont je parle. Il ne réduit pas vraiment au plateau (il minimise à la barre des tâches) et implique le code hackish pour montrer/cacher l'icône de la barre des tâches. –

Questions connexes