Question

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

Note:réduire à barre d'état système;sur le côté droit de la barre des tâches près de l'horloge.Je ne demande pas à réduire à la barre des tâches, qui est ce qui se passe lorsque vous appuyez sur le signe "moins" sur le bouton de la fenêtre.

J'ai vu hackish solutions comme, "réduire la, ensemble ShowInTaskbar = false, puis montrer votre NotifyIcon."

Les Solutions qui sont hackish car l'application ne semble pas réduire à la plaque comme d'autres applications, le code a pour détecter quand le jeu ShowInTaskbar = true, parmi d'autres problèmes.

Quelle est la bonne façon de le faire?

Était-ce utile?

La solution

Il est en fait pas gérés de façon de le faire que sous forme d'animation pour le bac en natif winforms, cependant, vous pouvez P/Invoke shell32.dll pour le faire:

Quelques bonnes infos ici (Dans les commentaires de ne pas le post):

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 comprendre ce truc de Pinvoke pour votre version de C#.

Autres conseils

this.WindowState = FormWindowState.Minimized  

Qui est construit dans le moyen de le faire et il semble bien pour moi la plupart du temps.La seule fois a quelques la folie de il est si vous l'appelez au démarrage qui a une certaine étrangeté, parfois c'est pourquoi la plupart des gens va également définir la ShowInTaskbar = false et masquer le formulaire de trop.

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

Il permet de:

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;
        }
    }
}

Ce code est testé et prend en charge de nombreuses options.

Plus ici: http://code.msdn.microsoft.com/TheNotifyIconExample

Mise à jour:Regarde comme j'ai posté trop vite.J'ai aussi été en utilisant le hack ci-dessous pour un outil de mine.En attente de la bonne solution pour ce..........

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

Ajouter NotifyIcon de la forme, de définir 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();
    }

Similaires comme ci-dessus...

J'ai un redimensionnement de gestionnaire d'événement qui est déclenché chaque fois que la fenêtre est redimensionnée (Agrandie, réduite, 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;
       }
    }

Cela permet à l'utilisateur de choisir s'ils veulent ou non à réduire dans la barre via une barre de menus.Ils peuvent aller pour Windows -> et cliquez sur Réduire dans la barre.Si cette option est cochée, et la fenêtre est redimensionnée afin de Minimiser l', puis il permettra de réduire au minimum le bac.Fonctionne parfaitement pour moi.

Dans le constructeur de la Forme:

this.Resize += new EventHandler(MainForm_Minimize);

Ensuite, utilisez cette méthode de Gestionnaire d'Événements:

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

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 le fom1.le concepteur.cs

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top