Qual è il modo corretto per ridurre a icona l’applicazione C # WinForms?

Qual è il modo corretto per ridurre a icona un’app WinForms nella barra delle applicazioni?

Nota: ridurre al minimo al vassoio di sistema ; sul lato destro della barra delle applicazioni accanto all’orologio. Non sto chiedendo di ridurre a icona barra delle applicazioni, che è quello che succede quando si preme il pulsante “meno” sulla finestra.

Ho visto soluzioni di hacking come “minimizzare, impostare ShowInTaskbar = false, quindi mostrare il tuo NotifyIcon.”

Soluzioni come questa sono trucidanti perché l’app non sembra minimizzare il vassoio come altre app, il codice deve rilevare quando impostare ShowInTaskbar = true, tra le altre questioni.

Qual è il modo corretto per farlo?

In realtà non esiste un modo gestito per fare quella forma di animazione al vassoio in winform nativi, tuttavia è ansible utilizzare P / Invoke shell32.dll per farlo:

Alcune buone informazioni qui (nei commenti non nel post):

http://blogs.msdn.com/jfoscoding/archive/2005/10/20/483300.aspx

Ed eccolo in C ++:

http://www.codeproject.com/KB/shell/minimizetotray.aspx

Puoi usarlo per capire quali cose su Pinvoke per la tua versione C #.

this.WindowState = FormWindowState.Minimized 

Questo è il modo in cui è costruito e mi sembra la cosa migliore per me. L’unica volta che ha qualche stranezza è se la chiami all’avvio che ha qualche stranezza a volte, motivo per cui la maggior parte delle persone imposterà anche ShowInTaskbar = false e nasconderà anche il form.

http://msdn.microsoft.com/en-us/library/system.windows.forms.form.windowstate.aspx

Aiuterà,

  public partial class Form1 : Form { public static bool Close = false; Icon[] images; int offset = 0; public Form1() { InitializeComponent(); notifyIcon1.BalloonTipText = "My application still working..."; notifyIcon1.BalloonTipTitle = "My Sample Application"; notifyIcon1.BalloonTipIcon = ToolTipIcon.Info; } private void Form1_Resize(object sender, EventArgs e) { if (FormWindowState.Minimized == WindowState) { this.Hide(); notifyIcon1.ShowBalloonTip(500); //WindowState = FormWindowState.Minimized; } } private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e) { this.Show(); notifyIcon1.ShowBalloonTip(1000); WindowState = FormWindowState.Normal; } private void maximizeToolStripMenuItem_Click(object sender, EventArgs e) { this.Show(); WindowState = FormWindowState.Normal; } private void closeToolStripMenuItem_Click(object sender, EventArgs e) { Close = true; this.Close(); } // Handle Closing of the Form. protected override void OnClosing(CancelEventArgs e) { if (Close) { e.Cancel = false; } else { WindowState = FormWindowState.Minimized; e.Cancel = true; } } private void Form1_Load(object sender, EventArgs e) { // Load the basic set of eight icons. images = new Icon[5]; images[0] = new Icon("C:\\icon1.ico"); images[1] = new Icon("C:\\icon2.ico"); images[2] = new Icon("C:\\icon3.ico"); images[3] = new Icon("C:\\icon4.ico"); images[4] = new Icon("C:\\icon5.ico"); } private void timer1_Tick(object sender, EventArgs e) { // Change the icon. // This event handler fires once every second (1000 ms). if (offset < 5) { notifyIcon1.Icon = images[offset]; offset++; } else { offset = 0; } } } 

Questo codice è testato e supporta molte opzioni.

Altro qui: http://code.msdn.microsoft.com/TheNotifyIconExample

Aggiornamento: sembra che ho postato troppo presto. Stavo anche usando il sotto hack per uno strumento mio. Aspettando la soluzione giusta per questo ……….

È ansible utilizzare Windows.Forms.NotifyIcon per questo. http://msdn.microsoft.com/en-us/library/system.windows.forms.notifyicon.aspx

Aggiungi NotifyIcon al modulo, imposta alcune proprietà e il gioco è fatto.

  this.ShowIcon = false;//for the main form this.ShowInTaskbar = false;//for the main form this.notifyIcon1.Visible = true;//for notify icon this.notifyIcon1.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon1.Icon")));//set an icon for notifyicon private void Form1_Shown(object sender, EventArgs e) { this.Hide(); } 

Simile come sopra …

Ho un gestore di eventi di ridimensionamento che viene triggersto ogni volta che la finestra viene ridimensionata (ingrandita, ridotta a icona, ecc.) …

  public form1() { Initialize Component(); this.Resize += new EventHanlder(form1_Resize); } private void form1_Resize(object sender, EventArgs e) { if (this.WindowState == FormWindowState.Minimized && minimizeToTrayToolStripMenuItem.Checked == true) { NotificationIcon1.Visible = true; NotificationIcon1.BalloonTipText = "Tool Tip Text" NotificationIcon1.ShowBalloonTip(2); //show balloon tip for 2 seconds NotificationIcon1.Text = "Balloon Text that shows when minimized to tray for 2 seconds"; this.WindowState = FormWindowState.Minimized; this.ShowInTaskbar = false; } } 

Ciò consente all’utente di selezionare se vogliono o meno ridurre al vassoio tramite una barra dei menu. Possono andare su Windows -> e fare clic su Riduci a Vassoio. Se questa opzione è selezionata e la finestra viene ridimensionata su Ridotta a icona, verrà ridotta a icona. Funziona perfettamente per me.

Nel costruttore della forma:

 this.Resize += new EventHandler(MainForm_Minimize); 

Quindi utilizzare questo metodo di gestore eventi:

  private void MainForm_Minimize(object sender, EventArgs e) { if(this.WindowState == FormWindowState.Minimized) Hide(); } 

Se hai problemi a farlo funzionare, controlla di averlo

 this.Resize += new System.EventHandler(this.Form1_Resize); 

nel file fom1.designer.cs