54 votes

Comment démarrer l'application WinForm réduite au bac?

J'ai réussi à créé une application qui minimise dans la barre de tâches à l'aide d'un NotifyIcon. Lorsque le formulaire est fermé manuellement il est bien caché sur le bureau, la barre des tâches, et alt-tab. Le problème se produit lorsque vous essayez de démarrer avec l'app réduite. Au premier abord, le problème était que l'application pourrait être réduite, mais reste dans le alt-tab boîte de dialogue. La modification de la FormBorderStyle à l'un des ToolWindow options (à partir de la "Aucun" en option) fixe, mais introduit un autre problème. Lorsque l'application démarre pour la première fois la barre de titre de la fenêtre réduite est visible juste au-dessus du menu démarrer:

Pic.

L'ouverture de la forme et de la fermeture il la fait pour cacher correctement. J'ai essayé beaucoup de variations, mais ici, c'est essentiellement la façon dont il fonctionne maintenant...

WindowState est la valeur réduit dans le Concepteur. Après quelques initialisation dans le constructeur, j'ai les lignes suivantes:

this.Visible = false;
this.ShowInTaskbar = false;

Lorsque le NotifyIcon est double-cliqué sur j'ai le texte suivant:

 this.WindowState = FormWindowState.Normal;
 this.Visible = true;
 this.ShowInTaskbar = true;

Comme je l'ai dit, j'ai essayé des tas de variations mineures sur ce (ce.Hide(), etc.). Est-il possible d'avoir le NotifyIcon être le principal composant tel que je peux tout à fait commencer et se débarrasser de la forme, tout en laissant la NotifyIcon en cours d'exécution? Il doit y avoir un moyen de démarrer l'application avec la forme réduite sans l'un de l'étrangeté. Merci de m'aider à le trouver!

86voto

Hans Passant Points 475940

Pour ce faire, il convient d’empêcher que le formulaire ne soit visible en premier lieu. Cela nécessite de surcharger SetVisibleCore (). Supposons un menu contextuel pour NotifyIcon avec une commande Show et Exit. Vous pouvez l'implémenter comme ceci:

 public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        notifyIcon1.ContextMenuStrip = contextMenuStrip1;
        this.showToolStripMenuItem.Click += showToolStripMenuItem_Click;
        this.exitToolStripMenuItem.Click += exitToolStripMenuItem_Click;
    }

    bool mAllowVisible;     // ContextMenu's Show command used
    bool mAllowClose;       // ContextMenu's Exit command used
    bool mLoadFired;        // Form was shown once

    protected override void SetVisibleCore(bool value) {
        if (!mAllowVisible) {
            value = false;
            if (!this.IsHandleCreated) CreateHandle();
        }
        base.SetVisibleCore(value);
    }

    protected override void OnFormClosing(FormClosingEventArgs e) {
        if (!mAllowClose) {
            this.Hide();
            e.Cancel = true;
        }
        base.OnFormClosing(e);
    }

    private void showToolStripMenuItem_Click(object sender, EventArgs e) {
        mAllowVisible = true;
        mLoadFired = true;
        Show();
    }

    private void exitToolStripMenuItem_Click(object sender, EventArgs e) {
        mAllowClose = mAllowVisible = true;
        if (!mLoadFired) Show();
        Close();
    }
}
 

Notez un pli avec l'événement Load, il ne se déclenchera pas tant que le formulaire principal n'est pas affiché. Veillez donc à effectuer l'initialisation dans le constructeur du formulaire, pas avec le gestionnaire d'événements Load.

24voto

jitbit Points 8072

Je suis en train de lire toutes les réponses et voir hacks et la magie noire... (n'en déplaise, contraintes)

Les gars, pas de hacks nécessaire. Vous n'avez même pas besoin de mettre "ShowInTaskbar=false" et d'autres trucs. Faites simplement ceci:

    //"Form Shown" event handler
    private void Form_Shown(object sender, EventArgs e)
    {
        //to minimize window
        this.WindowState = FormWindowState.Minimized;

        //to hide from taskbar
        this.Hide();
    }

NOTE: je vous recommande fortement de ne PAS TOUCHER à la "ShowInTaskbar de la propriété". Par exemple, si votre application enregistre l'échelle du système des raccourcis clavier ou d'autres trucs similaires (crochets, etc) - réglage de ShowInTaskBar=false et de minimiser votre application va empêcher Windows d'envoyer des messages à votre fenêtre... Et à vos crochets/raccourcis/etc cesser de travailler.

21voto

Yogesh Points 6818

Dans le constructeur , supprimez ces deux lignes:

 this.Visible = false;
this.ShowInTaskbar = false;
 

et ajoutez après InitializeComponent(); :

 this.WindowState = FormWindowState.Minimized;
 

Dans le concepteur, définissez ShowInTaskbar false & FormWindowState Normal .

EDIT: Si vous publiez la même chose dans l'événement Load, la fenêtre est minimisée mais reste affichée sur le bureau. Je pense que c'est un bug.

2voto

Justin Clarke Points 211

Lorsque vous réduisez une application et que vous souhaitez la masquer à partir de Alt + Tab:

Vous devez également définir l'opacité pour arrêter l'affichage de la barre de titre près du menu Démarrer lorsque vous définissez le style de bordure sur une fenêtre d'outils.

Sur l'événement minimiser:

 this.Visible = false;
this.Opacity = 0;
this.FormBorderStyle = FormBorderStyle.FixedToolWindow;
this.ShowInTaskbar = false;
 

Sur événement de normalisation:

 this.Visible = true;
this.Opacity = 100;
this.FormBorderStyle = FormBorderStyle.FixedSingle; //or whatever it was previously set to
this.ShowInTaskbar = true;
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X