2009-11-13 16 views
41

J'ai réussi à créer une application qui minimise dans le bac en utilisant un NotifyIcon. Lorsque le formulaire est fermé manuellement, il est masqué avec succès sur le bureau, la barre des tâches et l'onglet alt. 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 apparaîtrait toujours dans la boîte de dialogue alt-tab. Modifier le FormBorderStyle à l'une des options ToolWindow (à partir de l'option "None") a corrigé ce problème, mais a 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 de démarrage:Comment démarrer l'application WinForm réduite au minimum?

Pic http://i38.tinypic.com/2wny811.gif.

L'ouverture du formulaire et sa fermeture provoquent son masquage correct. J'ai essayé beaucoup de variations, mais voici essentiellement comment cela fonctionne en ce moment ...

WindowState est défini sur Minimized dans le concepteur. Après une initialisation dans le constructeur que j'ai les lignes suivantes:

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

Lorsque le NotifyIcon est un double-clic, je donne les résultats suivants:

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

Comme je l'ai dit, j'ai essayé beaucoup de variations mineures sur ceci (this.Hide(), etc.). Y a-t-il un moyen de faire en sorte que NotifyIcon soit le composant principal de sorte que je puisse commencer et éliminer complètement le formulaire tout en laissant NotifyIcon en cours d'exécution? Il doit y avoir un moyen de démarrer l'application avec le formulaire minimisé sans aucun de l'étrangeté. S'il vous plait aidez moi à le trouver!

Répondre

70

La bonne façon de faire est d'empêcher le formulaire d'être visible en premier lieu. Cela nécessite de surcharger SetVisibleCore(). Supposons un menu contextuel pour NotifyIcon avec une commande Show and Exit. Vous pouvez la mettre en œuvre 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(); 
    } 
} 

note une ride à l'événement de charge, il ne sera pas le feu jusqu'à ce que la forme principale est d'abord montré. Assurez-vous donc de faire l'initialisation dans le constructeur du formulaire, pas dans le gestionnaire d'événements Load.

+0

Brillant, merci! Il a fallu un peu de peaufiner pour le faire fonctionner avec mon application spécifique, mais ça marche super! – jluce50

+0

Excellente solution Hans, merci. – Segfault

+0

Fonctionne comme un charme! – psulek

16

Dans le constructeur , supprimer ces deux lignes:

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

et ajouter après InitializeComponent();:

this.WindowState = FormWindowState.Minimized; 

Designer, définissez ShowInTaskbar-false & FormWindowState-Normal. Si vous postez la même chose dans un événement Load, la fenêtre est minimisée mais reste réduite sur le bureau. Je pense que c'est un bug.

+2

Ou dans le cas de charge de la forme, puisque le constructeur est concepteur généré et vous Je crains que votre changement ne disparaisse de temps en temps. –

+0

Je suis d'accord, l'événement de chargement serait un meilleur endroit – Miles

+0

Voir ma modification. Votre changement disparaîtra seulement si vous postez la ligne que j'ai postée avant 'InitializeComponent();'. Tous vos paramètres de concepteur sont chargés dans 'InitializeComponent();'. – Yogesh

2

lors de la réduction d'une application et que vous voulez cacher Alt + Tab:

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

Sur Minimiser l'événement:

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

Sur Normaliser événement:

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

Très bien! Merci. – Damien

12

Je lis toutes les réponses et voir hacks et la magie noire ... (pas d'infraction, mates)

Les gars, pas de hacks nécessaires. Vous n'avez même pas besoin de définir "ShowInTaskbar = false" et d'autres choses. Il suffit de faire 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 recommande fortement la propriété ne touche pas "ShowInTaskbar". Par exemple, si votre application enregistre des raccourcis système ou d'autres éléments similaires (hooks, etc) - définir ShowInTaskBar = false et en minimisant votre application empêchera Windows d'envoyer des messages à votre fenêtre ... Et vos hooks/raccourcis clavier/etc arrête de travailler.

+0

Est-ce que cela affichera l'icône dans le bac comme demandé par l'OP? – WEFX

+0

Je faisais des recherches sur la façon de faire cela pour mon programme et cette réponse était le moyen le plus simple et le plus efficace d'atteindre mon objectif. – Brad

+0

@Brad non, vous devez toujours ajouter un NotifyIcon manuellement. mais il fera l'affaire après avoir ajouté l'icône. – user2404597

0

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() 

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

+0

Quelle langue est-ce? – LarsTech