用Visual C#做托盘程序

转载 2006年05月30日 14:28:00
所谓托盘程序顾名思义就是象托起的盘子一样的程序。而所谓的托起的盘子就是程序运行中显示出的图标,而托起的位置就是视窗系统的的工具栏了。托盘程序具有直观、占用屏幕空间较小并且可以为它定义多个功能菜单,这就给操作者带来了方便,所以越来越多的程序设计者都把程序设计成托盘这种方式。我们已经看过了用其他语言设计托盘程序的例子,其中的大部分,整个设计过程还是相对烦琐的。而对于微软公司极力推荐的下一代程序开发语言--Visual C#来说,却可以十分方便设计出一个托盘程序。本文就是介绍Visual C#设计托盘程序的具体过程。

   首先来介绍一下本文中设计托盘程序所需要的环境:

   (1).微软公司视窗2000服务器版

   (2)..Net FrameWork SDK Beta 2

   一. 托盘程序的主要步骤及解决方法:

   为什么说用Visual C#可以十分方便的做一个托盘程序,主要的原因是在.Net框架的软件开发包( .Net FrameWork SDK )中的WinForm组件中定义了一个专门用来开发托盘程序的组件--NotifyIcon组件。下面就来介绍一下这个组件的具体用法和程序设计中的主要的技巧。

   (1).如何在程序运行后隐藏窗体:

   我们知道托盘程序运行后是无法看见主窗体的,他只会显示在工具栏上。在用Visual C#设计此类程序的时候,可以用二种方法使得程序运行后不显示主窗体。其中一种方法是重载主窗体中的OnActivated( )事件,OnActivated( )事件是在窗体激活的时候才触发的。通过重载此事件可以达到隐藏主窗体的目的。具体程序代码如下:

protected override void OnActivated ( EventArgs e )
{
this.Hide ( ) ;
}

   另外一种方法是在初始化主窗体的时候完成的,通过设定主窗体的属性来达到不显示的目的。具体的程序代码如下:

this.MaximizeBox = false ;
this.MinimizeBox = false ;
this.WindowState = System.Windows.Forms.FormWindowState.Minimized ;

   在本文介绍的程序中,使用了第二种方法。
   (2).如何为托盘程序设定显示图标:

   在NotifyIcon组件中有一个属性icon就是来设定托盘图标的,由于Visual C#是一个完全的OOP (面向对象)语言,在Visual C#中任何东西都可以作为对象来处理。当然对应一个icon来说,也可以用对象的方法来处理他。我们通过下列语句来得到一个icon对象:

private Icon mNetTrayIcon = new Icon ( "Tray.ico" ) ;

   请注意:在编译好的程序中,必须要在同一个目录中有一个Tray.ico图标文件,否则程序运行时候会出错的。

   通过下列语句把此icon对象付给NotifyIcon组件中的icon属性,此时如果程序正确编译,则此icon就会显示在工具栏中了。

TrayIcon.Icon = mNetTrayIcon ;

   (3).设定当鼠标停留在托盘程序上显示的文本内容:

   NotifyIcon组件中有一个属性Text。设定这个属性的内容,就是鼠标停留在托盘图标上显示的内容了。具体语句如下:

TrayIcon.Text = "用Visual C#做托盘程序" + "/n" + "作者:马金虎于2001.12.08" ;

   (4).如何在托盘程序加入菜单:

   在NotifyIcon组件中有一个对象叫ContextMenu,在托盘程序中显示出的菜单就是通过设定此对象来实现的。以下的程序代码是为托盘程序加入菜单项:

notifyiconMnu = new ContextMenu ( mnuItms ) ;
TrayIcon.ContextMenu = notifyiconMnu ;
//为托盘程序设定菜单

   (5).如何设定ContextMenu对象的内容:

   ContextMenu对象是托盘程序的菜单的结构,所以如何设定此对象,在本程序中是比较关键的。在程序中,是通过定义一个菜单项数组,并对这个数组设定不同的值(这当中包括菜单的一些属性和事件),然后把这个数组同时赋值给ContextMenu对象,来实现对ContextMenu对象的设置过程的。以下是程序中具体代码:

//定义一个MenuItem数组,并把此数组同时赋值给ContextMenu对象
MenuItem [ ] mnuItms = new MenuItem [ 3 ] ;
mnuItms [ 0 ] = new MenuItem ( ) ;
mnuItms [ 0 ] .Text = "用Visual C#做托盘程序!" ;
mnuItms [ 0 ] .Click += new System.EventHandler ( this.showmessage ) ;

mnuItms [ 1 ] = new MenuItem ( "-" ) ;
mnuItms [ 2 ] = new MenuItem ( ) ;
mnuItms [ 2 ] .Text = "退出系统" ;
mnuItms [ 2 ] .Click += new System.EventHandler ( this.ExitSelect ) ;
mnuItms [ 2 ] .DefaultItem = true ;

notifyiconMnu = new ContextMenu ( mnuItms ) ;
TrayIcon.ContextMenu = notifyiconMnu ;
//为托盘程序加入设定好的ContextMenu对象


   当成功加入了ContextMenu对象后,在程序编译完成运行时,当鼠标右键点击托盘图标,程序会自动弹出ContextMenu对象封装好的菜单。

 


using System ;
using System.Drawing ;
using System.Collections ;
using System.ComponentModel ;
using System.Windows.Forms ;
using System.Data ;
//导入在程序中使用到的名称空间
public class Tray : Form
{
  private System.ComponentModel.Container components = null ;
  private Icon mNetTrayIcon = new Icon ( "Tray.ico" ) ;
  private NotifyIcon TrayIcon ;
  private ContextMenu notifyiconMnu ;

  public Tray()
  {
   //初始化窗体中使用到的组件
   InitializeComponent ( ) ;
   //初始化托盘程序的各个要素
   Initializenotifyicon ( ) ;
  }

private void Initializenotifyicon ( )
{
  //设定托盘程序的各个属性
  TrayIcon = new NotifyIcon ( ) ;
  TrayIcon.Icon = mNetTrayIcon ;
  TrayIcon.Text = "用Visual C#做托盘程序" + "/n" + "作者:马金虎于2001.12.08" ;
  TrayIcon.Visible = true ;
  TrayIcon.Click += new System.EventHandler ( this.click ) ;

  //定义一个MenuItem数组,并把此数组同时赋值给ContextMenu对象
  MenuItem [ ] mnuItms = new MenuItem [ 3 ] ;
  mnuItms [ 0 ] = new MenuItem ( ) ;
  mnuItms [ 0 ] .Text = "用Visual C#做托盘程序!" ;
  mnuItms [ 0 ] .Click += new System.EventHandler ( this.showmessage ) ;

  mnuItms [ 1 ] = new MenuItem ( "-" ) ;

  mnuItms [ 2 ] = new MenuItem ( ) ;
  mnuItms [ 2 ] .Text = "退出系统" ;
  mnuItms [ 2 ] .Click += new System.EventHandler ( this.ExitSelect ) ;
  mnuItms [ 2 ] .DefaultItem = true ;

  notifyiconMnu = new ContextMenu ( mnuItms ) ;
  TrayIcon.ContextMenu = notifyiconMnu ;
  //为托盘程序加入设定好的ContextMenu对象
}
public void click ( object sender , System.EventArgs e )
{
  MessageBox.Show ( "Visual C#编写托盘程序中的事件响应" ) ;
}

public void showmessage ( object sender , System.EventArgs e )
{
  MessageBox.Show ( "你点击了菜单的第一个选项" ) ;
}

public void ExitSelect ( object sender , System.EventArgs e )
{
  //隐藏托盘程序中的图标
  TrayIcon.Visible = false ;
  //关闭系统
  this.Close ( ) ;
}
//清除程序中使用过的资源
public override void Dispose ( )
{
  base.Dispose ( ) ;
  if ( components != null )
   components.Dispose ( ) ;
}

private void InitializeComponent ( )
{
  this.SuspendLayout ( ) ;
  this.AutoScaleBaseSize = new System.Drawing.Size ( 5 , 13 ) ;
  this.ClientSize = new System.Drawing.Size ( 320 , 56 ) ;
  this.ControlBox = false ;
  this.MaximizeBox = false ;
  this.MinimizeBox = false ;
  this.WindowState = System.Windows.Forms.FormWindowState.Minimized ;

  this.Name = "tray" ;
  this.ShowInTaskbar = false ;
  this.Text = "用Visual C#做托盘程序!" ;
  this.ResumeLayout ( false ) ;

}
static void Main ( )
{
  Application.Run ( new Tray ( ) ) ;
}
}

C#-WinForm设置托盘程序

背景现在很多程序都有这样的托盘程序 窗体关闭时,并不真正关闭程序,只是任务栏不显示该应用程序,在右下侧托盘里显示; 双击托盘,窗体还原; 右击窗体,出现托盘菜单,实现最小化,最大户,还原,退出等...
  • gatieme
  • gatieme
  • 2015年08月08日 11:50
  • 6007

如何将WPF窗口最小化到托盘,然后在托盘中双击打开窗口

https://social.microsoft.com/Forums/en-US/d43239e2-aee7-4737-bdcb-7e0de3a0842c/wpf?forum=wpfzhchs ...
  • stableboy
  • stableboy
  • 2016年02月05日 10:32
  • 2399

C#软件开发实例.私人订制自己的屏幕截图工具(三)托盘图标及菜单的实现

概述 添加托盘图标功能主要是为了添加菜单功能,可以通过托盘图标来管理程序;托盘菜单包括“打开保存目录、录制Flash动画、录制GIF动画、延时5秒截图、截图、设置、退出”等功能。 系统托盘 系统托盘是...
  • testcs_dn
  • testcs_dn
  • 2014年04月09日 13:20
  • 4635

windows服务+托盘控制程序

最近写windows服务需要有界面交互,反复查阅资料发现windows服务中是无法做界面弹出的。 最后敲定方案为:windows服务+子进程 的控制方式,其中windows服务中运行服务处理事务,在...
  • chenzy1900
  • chenzy1900
  • 2016年11月07日 23:01
  • 685

WPF ,利用Winform库中的NotifyIcon实现托盘小程序

运行界面如下所示:                          图1                                             图2          代码...
  • djc11282
  • djc11282
  • 2014年07月09日 10:31
  • 4063

【进程处理】4,刷新任务栏托盘区,清除异常关闭进程的残留图标

1,目的 之前介绍了枚举进程并关闭进程的方法,可是有一个问题,使用TerminateProcess关闭的进程如果生成过托盘图标,这个图标就会停留在右下角的托盘区(因为该进程来不及执行自己的图标清理...
  • dpsying
  • dpsying
  • 2014年02月28日 15:49
  • 7122

【C#】关于右下角托盘图标以及气泡使用的注意事项

说实话,今天有点蛋疼了,折腾个右下角弹出气泡好半天,最后脑瓜们一亮,找到原因了吗,好气又好笑,还好过程不长,顺手记录一笔,以资纪念。 系统使用的是win10 专业版,vs使用的是2015版本,进行w...
  • z3237109
  • z3237109
  • 2016年06月12日 14:10
  • 1750

C# 程序关闭托盘图标不会自动消失

调试winform程序的时候使用托盘图标遇到关闭了程序但是托盘图标并没有消失的情况,但是鼠标滑过图标就消失了,这样软件打开关闭次数多了会出现在托盘堆积大量图标的情况,开始以为是操作系统刷新问题,后来使...
  • sipvoiper
  • sipvoiper
  • 2016年12月18日 10:06
  • 1730

windows程序托盘图标以及消息提示--示例程序

之前两个博客介绍一些基本姿势,都是msdn上的,今天就介绍一下如何使用吧。 为了简单起见,还是创建一个MFC based on dialog 功能吧。 1创建托盘图标,封装了成一个函数: ...
  • u011135902
  • u011135902
  • 2016年01月19日 20:14
  • 672

Delphi 最小化程序到任务栏托盘 增加右键PopMenu

在做中间层时,中间层往往不需要点击关闭时立刻关闭,而是最小化到托盘。故而特意隐藏关闭按钮功能。        1)隐藏退出功能 用PopMenu退出菜单代替              1.增加pop...
  • yangjian900109
  • yangjian900109
  • 2016年04月02日 11:25
  • 2009
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用Visual C#做托盘程序
举报原因:
原因补充:

(最多只允许输入30个字)