C# 系统应用之窗体最小化至任务栏及常用操作

现在很多软件如360杀毒软件、酷狗音乐都拥有最小化至任务栏并在系统托盘区留下图标,我的项目同样需要该功能.所以本文主要叙述如何使用C#让窗体最小化至任务栏,同时在系统托盘区的图标点击左键能显示窗体,右键能关联控件显示3个常用功能.主要涉及到的控件是NotifyIcon和ContextMenuStrip,此类文章较多,希望作者以自己的独特视角给予大家帮助.

一.界面操作

1.创建"Windows窗体应用程序"项目,从"工具箱"中添加NotifyIcon(运行时期间在Windows任务栏右侧的通知区域显示图标).鼠标右击notifyIcon1属性,为控件属性Icon添加图标,Text属性为"****".

2.添加ContextMenuStrip(当用户右击关联控件时显示快键菜单).鼠标右键contextMenuStrip1属性,进入Items添加或右键"编辑项".添加3个toolStripMenuItem,设置其Text为"显示窗体"、"隐藏窗体"、"退出".如下图所示:

C# 系统应用之窗体最小化至任务栏及常用操作

3.关联系统托盘图标与右键菜单.设置notifyIcon1的ContextMenuStrip属性为contextMenuStrip1关联两个控件.运行程序,右下角任务栏的系统托盘处图标点击右键显示如下图所示:

C# 系统应用之窗体最小化至任务栏及常用操作

二.窗体设置

 窗体设置主要是当窗体点击"退出"按钮时,任务栏仍然显示图标且程序没有退出.设置Form1的MaximizeBox(窗体是否能最大化)属性设置为False,让其不能最大化.并为Form1添加FormClosing(当用户关闭窗体时,在窗体已关闭并制定关闭原因前发生)事件.如下图所示.

C# 系统应用之窗体最小化至任务栏及常用操作

添加代码如下,主要实现的功能是当用户点击窗体"关闭"按钮或通过Alt+F4快捷关闭时,取消关闭操作且窗体隐藏,任务栏图标仍然显示:

[csharp] view plain copy
  1. //窗体关闭前发生事件  
  2. private void Form1_FormClosing(object sender, FormClosingEventArgs e)  
  3. {  
  4.     //窗体关闭原因为单击"关闭"按钮或Alt+F4  
  5.     if (e.CloseReason == CloseReason.UserClosing)  
  6.     {  
  7.         e.Cancel = true;           //取消关闭操作 表现为不关闭窗体  
  8.         this.Hide();               //隐藏窗体  
  9.     }  
  10. }  

其中:FormClosingEventArgs 类为FormClosing事件提供数据,其属性Cancel获取或设置是否应取消事件的值,CloseReason获取一个值,该值指示关闭窗体的原因.(详见MSDN FormClosingEventArgs 类)
注意:添加的事件是Form_Closing-窗体关闭前发生,而不是Form_Closed窗体已关闭发生.它没有e.Cancel属性,会提示错误 "System.Windows.Forms.FormClosedEventArgs"不包含Cancel的定义.

三.系统托盘功能

常见的窗体最小化至任务栏(系统托盘)图标的功能:
1.当鼠标左键点击图标时,显示窗体.
2.当鼠标右键点击图标时,显示"显示窗体"\"隐藏窗体"\"退出"菜单栏,并有相对应的功能.

具体操作是:分别点击"显示窗体"\"隐藏窗体"\"退出"在其属性栏中添加"Click"事件.添加代码如下:

[csharp] view plain copy
  1. //"显示窗体"单击事件  
  2. private void toolStripMenuItem1_Click(object sender, EventArgs e)  
  3. {  
  4.     this.Show();                                //窗体显示  
  5.     this.WindowState = FormWindowState.Normal;  //窗体状态默认大小  
  6.     this.Activate();                            //**窗体给予焦点  
  7. }  
  8.   
  9. //"隐藏窗体"单击事件  
  10. private void toolStripMenuItem2_Click(object sender, EventArgs e)  
  11. {  
  12.     this.Hide();                      //隐藏窗体  
  13. }  
  14.   
  15. //"退出"单击事件  
  16. private void toolStripMenuItem3_Click(object sender, EventArgs e)  
  17. {  
  18.     //点击"是(YES)"退出程序  
  19.     if (MessageBox.Show("确定要退出程序?""安全提示",  
  20.                 System.Windows.Forms.MessageBoxButtons.YesNo,  
  21.                 System.Windows.Forms.MessageBoxIcon.Warning)  
  22.         == System.Windows.Forms.DialogResult.Yes)  
  23.     {  
  24.         notifyIcon1.Visible = false;   //设置图标不可见  
  25.         this.Close();                  //关闭窗体  
  26.         this.Dispose();                //释放资源  
  27.         Application.Exit();            //关闭应用程序窗体  
  28.     }  
  29. }  
其中,窗体的状态FormWindowState有Minimized(最小化)、Maximized(最大化)、Normal(默认大小).有的程序设置sizechanged事件,当用户点击"最小化"按钮窗体尺寸变化时才最小化至任务栏(系统托盘).但我认为打开程序时就有最小化图标更好,同时添加FormClosing事件更符合用户使用.点击"退出"运行结果如下图所示:

C# 系统应用之窗体最小化至任务栏及常用操作

最后添加鼠标左键图标显示窗体功能.右键notifyIcon1属性,添加MouseClick(鼠标单击组件时发生)事件.添加代码如下:

[csharp] view plain copy
  1. //鼠标左键图标事件  
  2. private void notifyIcon1_MouseClick(object sender, MouseEventArgs e)  
  3. {  
  4.     //点击鼠标"左键"发生  
  5.     if (e.Button == MouseButtons.Left)  
  6.     {  
  7.         this.Visible = true;                        //窗体可见  
  8.         this.WindowState = FormWindowState.Normal;  //窗体默认大小  
  9.         this.notifyIcon1.Visible = true;            //设置图标可见  
  10.     }  
  11. }  

四.完整代码

源代码如下:

[csharp] view plain copy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.ComponentModel;  
  4. using System.Data;  
  5. using System.Drawing;  
  6. using System.Linq;  
  7. using System.Text;  
  8. using System.Threading.Tasks;  
  9. using System.Windows.Forms;  
  10.   
  11. namespace WinFormMin  
  12. {  
  13.     public partial class Form1 : Form  
  14.     {  
  15.         public Form1()  
  16.         {  
  17.             InitializeComponent();  
  18.         }  
  19.   
  20.         //窗体关闭前发生事件  
  21.         private void Form1_FormClosing(object sender, FormClosingEventArgs e)  
  22.         {  
  23.             //窗体关闭原因为单击"关闭"按钮或Alt+F4  
  24.             if (e.CloseReason == CloseReason.UserClosing)  
  25.             {  
  26.                 e.Cancel = true;           //取消关闭操作 表现为不关闭窗体  
  27.                 this.Hide();               //隐藏窗体  
  28.             }  
  29.         }  
  30.   
  31.         //"显示窗体"单击事件  
  32.         private void toolStripMenuItem1_Click(object sender, EventArgs e)  
  33.         {  
  34.             this.Show();                                //窗体显示  
  35.             this.WindowState = FormWindowState.Normal;  //窗体状态默认大小  
  36.             this.Activate();                            //**窗体给予焦点  
  37.         }  
  38.   
  39.         //"隐藏窗体"单击事件  
  40.         private void toolStripMenuItem2_Click(object sender, EventArgs e)  
  41.         {  
  42.             this.Hide();                      //隐藏窗体  
  43.         }  
  44.   
  45.         //"退出"单击事件  
  46.         private void toolStripMenuItem3_Click(object sender, EventArgs e)  
  47.         {  
  48.             //点击"是(YES)"退出程序  
  49.             if (MessageBox.Show("确定要退出程序?""安全提示",  
  50.                         System.Windows.Forms.MessageBoxButtons.YesNo,  
  51.                         System.Windows.Forms.MessageBoxIcon.Warning)  
  52.                 == System.Windows.Forms.DialogResult.Yes)  
  53.             {  
  54.                 notifyIcon1.Visible = false;   //设置图标不可见  
  55.                 this.Close();                  //关闭窗体  
  56.                 this.Dispose();                //释放资源  
  57.                 Application.Exit();            //关闭应用程序窗体  
  58.             }  
  59.         }  
  60.   
  61.         //鼠标左键图标事件  
  62.         private void notifyIcon1_MouseClick(object sender, MouseEventArgs e)  
  63.         {  
  64.             //点击鼠标"左键"发生  
  65.             if (e.Button == MouseButtons.Left)  
  66.             {  
  67.                 this.Visible = true;                        //窗体可见  
  68.                 this.WindowState = FormWindowState.Normal;  //窗体默认大小  
  69.                 this.notifyIcon1.Visible = true;            //设置图标可见  
  70.             }  
  71.         }  
  72.     }  
  73. }  

代码链接: https://download.****.net/download/imxiangzi/10394257

五.总结

该文章主要是结合自己的项目完成,主要是窗体最小化至任务栏(系统托盘)同时包括一些常用操作.同时下面两篇文章涉及到点击"最小化"按钮才实现最小到任务栏的文章,与该篇文章略有不同,如果想做这方面的可以阅读.感谢两位文章作者.
最后,希望文章对大家有所帮助,如果该篇文章中有错误或不足之处,请大家海涵!