Qual è il modo corretto per ridurre a icona nel vassoio un'app C# WinForms?
Domanda
Qual è il modo corretto per ridurre a icona un'app WinForms nella barra delle applicazioni?
Nota:minimizzare a area di notifica;sul lato destro della barra delle applicazioni accanto all'orologio.Non sto chiedendo di ridurre a icona la barra delle applicazioni, che è ciò che accade quando premi il pulsante "meno" sulla finestra.
Ho visto soluzioni hacker come "riduci a icona, imposta ShowInTaskbar = false, quindi mostra la tua NotifyIcon".
Soluzioni del genere sono hacker perché l'app non sembra ridursi a icona nella barra delle applicazioni come altre app, il codice deve rilevare quando impostare ShowInTaskbar = true, tra gli altri problemi.
Qual è il modo corretto per farlo?
Soluzione
In realtà non esiste un modo gestito per eseguire quella forma di animazione nel vassoio nei winform nativi, tuttavia puoi 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 elementi Pinvoke per la tua versione C#.
Altri suggerimenti
this.WindowState = FormWindowState.Minimized
Questo è il modo integrato per farlo e mi sembra che vada bene per la maggior parte del tempo.L'unica volta che ha qualche stranezza è se lo chiami all'avvio, il che a volte ha qualche stranezza, motivo per cui la maggior parte delle persone imposterà anche ShowInTaskbar = false e nasconderà anche il modulo.
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 l'hack qui sotto per un mio strumento.Aspetto la giusta soluzione a questo....
Puoi 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 eventi di ridimensionamento che viene attivato ogni volta che la finestra viene ridimensionata (massimizzata, 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 desidera o meno minimizzare nel vassoio tramite una barra dei menu.Possono andare su Windows -> e fare clic su Riduci a icona nel vassoio.Se questo viene controllato e la finestra viene ridimensionata per ridurre al minimo, allora minimizzerà per il vassoio.Funziona perfettamente per me.
Nel costruttore del Form:
this.Resize += new EventHandler(MainForm_Minimize);
Quindi utilizzare questo metodo del 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 fatto
this.Resize += new System.EventHandler(this.Form1_Resize);
nel fom1.designer.cs