这里给出WPF下,使用任务栏托盘图标的一种方法。不需要增加第三方的DLL引用,只需要增加框架本身自带的一些引用。
代码如下:
private NotifyIcon notifyIcon = null;
WindowState ws;//判断窗口是否最小化的时候用
WindowState wsl;//记录窗口隐藏前的状态
//放在构造函数中,执行此方法
public void SystemIcon()
{
SetNotifyIcon();
contextMenu();
}
/// <summary>
/// 创建系统托盘图标
/// </summary>
public void SetNotifyIcon()
{
this.notifyIcon = new NotifyIcon();
this.notifyIcon.Text = "文件监视器";//最小化到托盘时,鼠标在图标上显示的文本
System.Drawing.Icon icon1 = new System.Drawing.Icon(System.Windows.Application.GetResourceStream(new Uri("/Photo/WPF.ico", UriKind.Relative)).Stream);//程序图标,这里需要改成你程序中图标的路径,注意图片的格式。
this.notifyIcon.Icon = icon1;//指定图标
this.notifyIcon.Visible = false;//初始时不可见
notifyIcon.MouseDoubleClick += (OnNotifyIconDoubleClick);//双击事件
//记录窗口的状态
wsl = WindowState;
}
/// <summary>
/// 图标双击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnNotifyIconDoubleClick(object sender, System.Windows.Forms.MouseEventArgs e)
{
this.Show();//显示窗口
WindowState = wsl;//还原窗口状态
}
#region 托盘右键菜单
/// <summary>
/// 托盘图标菜单及事件
/// </summary>
private void contextMenu()
{
ContextMenuStrip cms = new ContextMenuStrip();
//关联 NotifyIcon 和 ContextMenuStrip
notifyIcon.ContextMenuStrip = cms;
System.Windows.Forms.ToolStripMenuItem exitMenuItem = new System.Windows.Forms.ToolStripMenuItem();
exitMenuItem.Text = "退出";
exitMenuItem.Click += new EventHandler(exitMenuItem_Click);
System.Windows.Forms.ToolStripMenuItem hideMenumItem = new System.Windows.Forms.ToolStripMenuItem();
hideMenumItem.Text = "隐藏";
hideMenumItem.Click += new EventHandler(hideMenumItem_Click);
System.Windows.Forms.ToolStripMenuItem showMenuItem = new System.Windows.Forms.ToolStripMenuItem();
showMenuItem.Text = "显示";
showMenuItem.Click += new EventHandler(showMenuItem_Click);
cms.Items.Add(exitMenuItem);
cms.Items.Add(hideMenumItem);
cms.Items.Add(showMenuItem);
}
/// <summary>
/// 退出事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void exitMenuItem_Click(object sender, EventArgs e)
{
notifyIcon.Visible = false;
//延迟退出
Thread.Sleep(1000 * 2);
//释放托盘图标资源,在点击程序右上角退出时,同样需要调用这个方法。
this.notifyIcon.Dispose();
//终止线程
System.Windows.Application.Current.Shutdown();
}
/// <summary>
/// 隐藏事件,将主窗口隐藏,记住窗口状态
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void hideMenumItem_Click(object sender, EventArgs e)
{
this.Hide();
WindowState = wsl;//还原窗口状态
}
/// <summary>
/// 主界面显示
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void showMenuItem_Click(object sender, EventArgs e)
{
this.Show();
}
#endregion
/// <summary>
/// StateChanged事件,在窗口大小改变时,检测是否是最小化
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Window_StateChanged(object sender, EventArgs e)
{
ws = this.WindowState;
if (ws == WindowState.Minimized)
{
this.Hide();
this.notifyIcon.Visible = true;
//弹气泡/通知框提示WIN7系统中有效
this.notifyIcon.ShowBalloonTip(20, "气泡弹窗标题", "气泡弹窗内容", ToolTipIcon.Info);
//notifyIcon.BalloonTipTitle = "程序系统托盘图标";//设置气泡弹窗标题
//notifyIcon.BalloonTipText = "Hello, 文件监视器"; //设置气泡弹窗内容
//notifyIcon.ShowBalloonTip(1000);//消失之前的显示时间
}
}