Каков правильный способ минимизации в трее приложения c# WinForms?
Как правильно минимизировать приложение WinForms в системном трее?
Примечание: уменьшить до трее; на правой стороне панели задач часы. Я не спрашиваю о минимизации панели задач, что происходит, когда вы нажимаете кнопку "минус" в окне.
Я видел хакерские решения, такие как " минимизировать, установить ShowInTaskbar = false, а затем показать свой NotifyIcon."
решений, как программистские, так приложение, похоже, не сворачивается в лоток, как и другие приложения, код должен определить, когда установить ShowInTaskbar = true, среди других проблем.
Как правильно это сделать?
8 ответов
на самом деле нет управляемого способа сделать эту форму анимации в трее в собственных winforms, однако вы можете P/Invoke shell32.dll, чтобы сделать это:
некоторая хорошая информация здесь (в комментариях не пост):
http://blogs.msdn.com/jfoscoding/archive/2005/10/20/483300.aspx
и вот он на C++:
http://www.codeproject.com/KB/shell/minimizetotray.aspx
вы можете использовать это, чтобы выяснить какой материал для Pinvoke для вашей версии c#.
this.WindowState = FormWindowState.Minimized
это встроенный способ сделать это, и он выглядит нормально для меня большую часть времени. Единственное время имеет некоторую странность, если вы вызываете его при запуске, который иногда имеет некоторую странность, поэтому большинство людей также установят ShowInTaskbar = false и скроют форму.
http://msdn.microsoft.com/en-us/library/system.windows.forms.form.windowstate.aspx
Это помогает,
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;
}
}
}
этот код протестирован и поддерживает множество опций.
подробнее здесь:http://code.msdn.microsoft.com/TheNotifyIconExample
Update: похоже, я опубликовал слишком рано. Я также использовал нижеприведенный хак для своего инструмента. В ожидании правильного решения для этого..........
вы можете использовать Windows.Формы.NotifyIcon для этого. http://msdn.microsoft.com/en-us/library/system.windows.forms.notifyicon.aspx
добавьте NotifyIcon в форму, установите некоторые свойства, и все готово.
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();
}
аналогично, как и выше...
У меня есть обработчик событий изменения размера, который запускается всякий раз, когда окно изменяется (максимизируется, минимизируется и т. д.)...
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;
}
}
это позволяет пользователю выбрать, хотят ли они минимизировать лоток через меню. Они могут перейти в Windows - > и нажать "свернуть в лоток". Если это проверено, и окно изменяется до минимума, затем оно будет свернуто в лоток. Работает безупречно для меня.
в конструкторе формы:
this.Resize += new EventHandler(MainForm_Minimize);
затем используйте этот метод обработчика событий:
private void MainForm_Minimize(object sender, EventArgs e)
{
if(this.WindowState == FormWindowState.Minimized)
Hide();
}
Если у вас возникли проблемы с получением этой работы, проверьте, что у вас есть
this.Resize += new System.EventHandler(this.Form1_Resize);
в fom1.дизайнер.cs