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:
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!
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.
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.
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.
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;
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 ...