Question

Je souhaite que mon application soit réduite à la zone de notification lorsque vous cliquez sur le bouton de fermeture (X).

Et il ne sera fermé qu'en cliquant sur un bouton / menu différent dans la fenêtre principale de l'application ou en cliquant sur un élément du menu contextuel de la barre d'état système.

Je suis en mesure de réduire la taille de la fenêtre au niveau du plateau à la fermeture.

Mais le problème auquel je suis confronté est que je ne parviens plus à fermer l'application.

Ceci est mon code (il est impossible de fermer l'application):

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void hideToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Visible = false;
        }

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

        private void quitToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Application.DoEvents();
            Application.Exit();
        }

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

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            e.Cancel = true;
            this.WindowState = FormWindowState.Minimized;
        }

        private void notifyIcon1_DoubleClick(object sender, EventArgs e)
        {
            this.Show();
            this.WindowState = FormWindowState.Normal;
        }        
    }
Était-ce utile?

La solution

Dans le bouton, définissez un champ, par exemple:

bool isClosing;
private void quitToolStripMenuItem_Click(object sender, EventArgs e)
{
    isClosing = true;
    Close();
}

et cochez cette case dans la "fermeture":

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    if(!isClosing) {
        e.Cancel = true;
        this.WindowState = FormWindowState.Minimized;
    }
}

Autres conseils

En effet, il frappe toujours le gestionnaire d'événements de clôture de formulaire où vous annulez l'événement.

Placez-y une condition et ignorez l'annulation de l'événement si le formulaire est déjà réduit au minimum

Je pourrais recommander une approche légèrement différente. Le principal problème que vous rencontrez est que votre application est exécutée en tant que formulaire. Vous avez donc besoin de nombreuses solutions de contournement pour vous assurer que le formulaire ne se ferme pas.

Lorsque je travaille avec une application qui réside vraiment dans la barre d'état système, je crée un contexte d'application personnalisé, ce qui simplifie réellement le processus. Voici un article que j'ai écrit vous montre comment le faire.

Ajoutez un indicateur aux endroits où vous substituez le comportement de fermeture, et couvrez également les autres cas de sortie en vérifiant la valeur d'énumération CloseReason sur l'argument d'événement de fermeture.

bool m_NeedClose = false;

private void quitToolStripMenuItem_Click(object sender, EventArgs e)
{
    m_NeedClose = true;
    Close();
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    if(m_NeedClose ||
      (e.CloseReason != CloseReason.UserClosing))
    {
        return;
    }

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

FormClosingEventArgs @ MSDN
Enumération CloseReason @ MSDN

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