web-dev-qa-db-fra.com

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

J'ai créé avec succès une application qui se réduit au bac à l'aide d'un NotifyIcon. Lorsque le formulaire est fermé manuellement, il est correctement caché du bureau, de la barre des tâches et de l’alt-tab. Le problème se produit lorsque vous essayez de démarrer avec l'application réduite. Au début, le problème était que l'application serait minimisée mais qu'elle apparaitrait toujours dans la boîte de dialogue alt-tab. Remplacer FormBorderStyle par l'une des options de ToolWindow (de l'option "Aucune") a résolu ce problème, mais a introduit un autre problème. Lorsque l'application commence pour la première fois, la barre de titre de la fenêtre réduite est visible juste au-dessus du menu Démarrer:

 enter image description here

L'ouverture et la fermeture du formulaire entraîne son masquage correct. J'ai essayé beaucoup de variations, mais voici essentiellement comment ça marche en ce moment ...

WindowState est défini sur Minimized dans le Designer. Après quelques initialisations dans le constructeur, j'ai les lignes suivantes:

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

Lorsque vous double-cliquez sur NotifyIcon, j'ai les éléments suivants:

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

Comme je l'ai dit, j'ai essayé beaucoup de variations mineures à ce sujet (this.Hide (), etc.). Existe-t-il un moyen de faire de NotifyIcon le composant principal de sorte que je puisse complètement démarrer et éliminer le formulaire tout en laissant le NotifyIcon en marche? Il doit y avoir un moyen de démarrer l'application avec la forme réduite au minimum, sans aucune bizarrerie. S'il vous plait aidez moi à le trouver!

44
jluce50

La bonne façon de procéder consiste à éviter 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;
    }

    private bool allowVisible;     // ContextMenu's Show command used
    private bool allowClose;       // ContextMenu's Exit command used

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

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

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

    private void exitToolStripMenuItem_Click(object sender, EventArgs e) {
        allowClose = true;
        Application.Exit();
    }
}

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.

75
Hans Passant

Dans le constructeur, supprimez ces deux lignes:

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

et ajouter après InitializeComponent();:

this.WindowState = FormWindowState.Minimized;

Dans Designer, définissez ShowInTaskbar sur false & FormWindowState sur Normal.

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

17
Yogesh

Je lis toutes les réponses et vois des hacks et de la magie noire ... (aucune infraction, les copains)

Les gars, pas de bidouilles nécessaires. Vous n'avez même pas besoin de définir "ShowInTaskbar = false" et d'autres éléments. Faites juste 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();
    }

REMARQUE: Je vous recommande vivement de ne PAS TOUCHER la propriété "ShowInTaskbar". Par exemple, si votre application enregistre des raccourcis clavier ou autres éléments similaires à l'échelle du système (crochets, etc.), définir ShowInTaskBar = false et réduire votre application empêcheront Windows d'envoyer des messages à votre fenêtre ... arrête de travailler.

15
Alex

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;

En cas de normalisation:

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

Cette "solution rapide et sale" a fonctionné pour moi:

$form1.FormBorderStyle = "fixedtoolwindow"
$form1.top = -1000000
$form1.Left = -1000000
$form1.Width = 10
$form1.Height = 10
$form1.WindowState = "normal"
$form1.ShowInTaskbar = $False
$form1.Opacity = 0
$form1.Hide()

J'espère que ça aide quelqu'un d'autre ...

0
David R