功能描述:
- 功能实现窗体如何不在Window任务栏中显示和隐藏
- 窗体最小化后在Window系统托盘中显示
使用场景:
- 程序希望在Window中后台运行,同时还希望有消息提醒功能
知识点:
- NotifyIcon、ContextMenuStrip控件的配合使用
- Form窗体Visible、WindowState、ShowIcon、ShowInTaskbar属性的区分
详细操作避坑指南:
- 使用NotifyIcon控件会让程序在Window系统托盘中出现一个图标,需要注意的是必须给控件配置Icon属性,如果不配置就不会在系统托盘中显示。效果入下图:
- NotifyIcon控件还有一个ContextMenuStrip属性配置上右键系统托盘中图标以后就会出现上图中菜单内容。
- 窗体属性ShowIcon默认是显示状态如果需要隐藏这个图标就需要修改属性,当属性为False后窗体左上角图标和任务栏图标就不会在显示。效果入下图:
- 窗体属性ShowInTaskbar会影响程序是否在任务中出现,如果设置为False窗体最小化时就不会出现在任务栏中,如果程序中没有配置NotifyIcon控件程序将彻底隐藏,关闭它的方式只能到任务管理器中去查找。效果入下图:
- 窗体的Visible属性可以控制窗体的显示,这个状态有别于WindowState属性的Minimized最小化并不是修改Visible属性,这个概念要区分清楚。
主窗体代码:
using System;
using System.Windows.Forms;
namespace WinFormWindowState
{
/// <summary>
/// 功能描述:
/// 1.功能实现窗体如何不在Window任务栏中显示和隐藏
/// 2.窗体最小化后在Window系统托盘中显示
/// 使用场景:
/// 1.程序希望在Window中后台运行,同时还希望有消息提醒功能
/// 知识点:
/// 1.NotifyIcon、ContextMenuStrip控件的配合使用
/// 2.Form窗口Visible、WindowState、ShowIcon、ShowInTaskbar属性的区分
/// </summary>
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 点击窗体关闭按钮时弹出是否关闭窗体提示
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
AlterFormClose formClose = new AlterFormClose();//关闭窗体前显示操作提示窗体
var result = formClose.ShowDialog();//根据窗体操作内容做后续操作
if (result == DialogResult.Cancel)
{
e.Cancel = true;
}
else if (result == DialogResult.No)
{
e.Cancel = true;
this.Hide();
this.WindowState = FormWindowState.Minimized;
}
}
/// <summary>
/// 窗体加载中调整属性值
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_Load(object sender, EventArgs e)
{
this.ShowIcon = false;//窗体左上角不会显示图标只显示窗体名称,并且窗体最小化在任务栏中不会显示图标
this.ShowInTaskbar = false;//隐藏窗体在任务栏中的位置
}
/// <summary>
/// 点击菜单中打开窗口按钮事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void toolStripMenuItemOpenWIndow_Click(object sender, EventArgs e)
{
this.Show();
this.WindowState = FormWindowState.Normal;
}
/// <summary>
/// 点击菜单中退出按钮事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void toolStripMenuItemExit_Click(object sender, EventArgs e)
{
this.Dispose();
}
/// <summary>
/// 双击消息框根据窗台状态自动隐藏或显示
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
{
if (this.WindowState != FormWindowState.Minimized)
{
this.Hide();
this.WindowState = FormWindowState.Minimized;
}
else
{
this.Show();
this.WindowState = FormWindowState.Normal;
}
}
/// <summary>
/// 显示消息内容
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
this.notifyIcon1.Visible = true;
this.notifyIcon1.ShowBalloonTip(30, "注意,您收到一条消息", "显示消息内容测试", ToolTipIcon.Info);
}
}
}
弹出窗台代码:
using System;
using System.Windows.Forms;
namespace WinFormWindowState
{
public partial class AlterFormClose : Form
{
private bool CloseWindowState;
public AlterFormClose()
{
InitializeComponent();
this.ShowIcon = false;
}
private void button2_Click(object sender, EventArgs e)
{
this.Close();
this.DialogResult = DialogResult.Cancel;
}
private void button1_Click(object sender, EventArgs e)
{
this.Close();
this.DialogResult = CloseWindowState ? DialogResult.Yes : DialogResult.No;
}
private void radioButton1_CheckedChanged(object sender, EventArgs e)
{
RadioButton rbn = sender as RadioButton;
if (rbn.Checked)
{
string tag = rbn.Text.ToString();
if (tag == "退出程序")
{
CloseWindowState = true;
}
else
{
CloseWindowState = false;
}
}
}
}
}