2009-11-13 15 views
41

Ho creato con successo un'app che riduce al minimo il vassoio utilizzando un NotifyIcon. Quando il modulo viene chiuso manualmente, viene nascosto con successo dal desktop, dalla barra delle applicazioni e da alt-tab. Il problema si verifica quando si tenta di iniziare con l'app ridotta a icona. All'inizio il problema era che l'app sarebbe stata minimizzata, ma sarebbe comunque comparsa nella finestra di dialogo alt-tab. Cambiando FormBorderStyle in una delle opzioni di ToolWindow (dall'opzione "None") è stato corretto, ma è stato introdotto un altro problema. Quando l'app avvia per la prima volta la barra del titolo della finestra ridotta a icona è visibile appena sopra il menu di avvio:Come avviare l'app WinForm ridotta a vassoio?

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

L'apertura del modulo e la chiusura lo fanno nascondere correttamente. Ho provato molte varianti, ma ecco come funziona adesso ...

WindowState è impostato su Minimizzato nella finestra di progettazione. Dopo un po 'l'inizializzazione nel costruttore Ho le seguenti linee:

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

Quando il NotifyIcon si fa doppio clic Ho il seguente:

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

Come ho detto, ho provato un sacco di piccole variazioni su questo (this.Hide(), ecc.). C'è un modo per fare in modo che NotifyIcon sia il componente principale in modo tale da poter avviare e disporre del modulo completamente lasciando il NotifyIcon in esecuzione? Deve esserci un modo per avviare l'app con il modulo ridotto al minimo senza alcuna stranezza. Per favore aiutami a trovarlo!

risposta

70

Il modo corretto per eseguire questa operazione è impedire che il modulo venga visualizzato in primo luogo. Ciò richiede l'override di SetVisibleCore(). Assumiamo un menu di scelta rapida per NotifyIcon con un comando Show and Exit. È possibile implementare in questo modo:

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

nota una ruga con l'evento Load, non sparerà fino a quando il modulo principale viene prima mostrato. Quindi assicurati di eseguire l'inizializzazione nel costruttore del modulo, non nel gestore di eventi Load.

+0

Brillante, grazie! Ho preso un piccolo ritocco per farlo funzionare con la mia app specifica, ma funziona benissimo! – jluce50

+0

Ottima soluzione Hans, grazie. – Segfault

+0

Funziona come un fascino! – psulek

16

Nel costruttore, rimuovere queste due righe:

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

e aggiungere dopo InitializeComponent();:

this.WindowState = FormWindowState.Minimized; 

In Designer, impostare ShowInTaskbar-false & FormWindowState-Normal.

EDIT: Se pubblichi lo stesso nell'evento Load, la finestra venga ridotto al minimo, ma mostra ancora minimizzato sul desktop. Penso che questo sia un bug.

+2

O nel caso di carico del modulo, dal momento che il costruttore è designer-generated e si' è probabile che il tuo cambiamento scompaia di quando in quando. –

+0

Sono d'accordo, caricare evento sarebbe un posto migliore – Miles

+0

Vedere la mia modifica. La tua modifica sparirà solo se pubblichi la riga che ho postato prima di 'InitializeComponent();'. Tutte le impostazioni del tuo designer sono caricate in 'InitializeComponent();'. – Yogesh

2

Quando minimizzando un'applicazione e si desidera nasconderlo da Alt + Tab:

È inoltre necessario impostare l'opacità per fermare la barra del titolo che mostra vicino al menu di avvio quando si imposta lo stile del bordo di una finestra di strumenti.

sul livello minimo evento:

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

Su Normalizzare evento:

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

Molto bello! Grazie. – Damien

12

sto leggendo tutte le risposte e vedere hack e la magia nera ... (senza offesa, compagni)

Ragazzi, non sono necessari hack. Non hai nemmeno bisogno di impostare "ShowInTaskbar = false" e altre cose. Basta fare questo:

//"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(); 
    } 

NOTA: ho vivamente che non tocca la proprietà "ShowInTaskbar". Ad esempio, se l'applicazione registra tasti di scelta rapida a livello di sistema o altri elementi simili (hooks, ecc.) - l'impostazione ShowInTaskBar = false e la minimizzazione della tua app impediranno a Windows di inviare alcuni messaggi alla tua finestra ... E i tuoi hook/hotkeys/etc smetti di lavorare.

+0

Questo mostrerà l'icona nel vassoio come l'OP richiesto? – WEFX

+0

Stavo facendo delle ricerche su come fare questo per il mio programma e questa risposta era il modo più semplice ed efficace per raggiungere il mio obiettivo. – Brad

+0

@Brad no, è comunque necessario aggiungere manualmente un NotifyIcon. ma farà il trucco dopo aver aggiunto l'icona. – user2404597

0

Questa "soluzione rapida e sporca" ha lavorato per me:

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

Speranza che aiuta qualcun altro ...

+0

Che lingua è? – LarsTech

Problemi correlati