Каков правильный способ минимизировать лоток для приложения 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
обновление: похоже, я слишком рано выложили. Я также использовал ниже хак для моего инструмента. Ждем правильного решения для этого..........
вы можете использовать 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 - > и нажать кнопку Свернуть в лоток. Если это проверено, и окно изменяется до минимума, а затем оно будет свернуто в лоток. Работает безупречно для меня.