c# 做 windows 托盘程序

所谓托盘程序顾名思义就是象托起的盘子一样的程序。而所谓的托起的盘子就是程序运行中显示出的图标,而托起的位置就是视窗系统的的工具栏了。托盘程序具有直观、占用屏幕空间较小并且可以为它定义多个功能菜单,这就给操作者带来了方便,所以越来越多的程序设计者都把程序设计成托盘这种方式。我们已经看过了用其他语言设计托盘程序的例子,其中的大部分,整个设计过程还是相对烦琐的。而对于微软公司极力推荐的下一代程序开发语言 --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 对象封装好的菜单。
二. 本文介绍的程序源代码 ( Tray.cs ) 和编译后程序运行界面:

下图时 Tray.cs 成功编译后的运行界面:

  图 01 :程序运行界面

   Tray.cs 源程序代码:
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 ( ) ) ;
}
}

  三. 总结:

  通过以上介绍,可以看出用 Visual C# 做一个托盘程序并不是一件复杂的事情,而是一件比较轻松的事情。同样也可使我们明白, Visual C# 虽然是一种功能强大的程序设计语言,但它只是一个打开 .Net FrameWork SDK 的钥匙,正是这个内容丰富的软件包,才使得各个 .Net 程序开发语言有了施展自身功能更广阔的舞台。


 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 Windows API 中的 Shell_NotifyIcon 函数来给托盘程序发送消息。 首先需要定义一个 NOTIFYICONDATA 的结构体,用于传递托盘图标的信息。示例代码如下: ``` [StructLayout(LayoutKind.Sequential)] public struct NOTIFYICONDATA { public int cbSize; public IntPtr hWnd; public int uID; public int uFlags; public int uCallbackMessage; public IntPtr hIcon; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] public string szTip; } ``` 其中,cbSize 表示结构体的大小;hWnd 表示托盘程序的窗口句柄;uID 表示托盘图标的 ID;uFlags 表示托盘图标的属性;uCallbackMessage 表示托盘程序接收消息的消息 ID;hIcon 表示托盘图标的句柄;szTip 表示鼠标悬停在托盘图标上时显示的提示文本。 接下来,可以使用 Shell_NotifyIcon 函数来发送消息。示例代码如下: ``` [DllImport("shell32.dll", CharSet = CharSet.Auto)] public static extern bool Shell_NotifyIcon(int dwMessage, ref NOTIFYICONDATA pnid); public const int NIM_ADD = 0x00000000; public const int NIM_MODIFY = 0x00000001; public const int NIM_DELETE = 0x00000002; public const int WM_USER = 0x0400; public const int WM_APP = 0x8000; public void SendMessageToTray(int uID, int uMsg) { NOTIFYICONDATA nid = new NOTIFYICONDATA(); nid.cbSize = Marshal.SizeOf(nid); nid.hWnd = this.Handle; nid.uID = uID; nid.uFlags = 0; nid.uCallbackMessage = WM_USER + uMsg; Shell_NotifyIcon(NIM_MODIFY, ref nid); } ``` 其中,dwMessage 参数表示要执行的操作,可以是 NIM_ADD(添加托盘图标)、NIM_MODIFY(修改托盘图标)或 NIM_DELETE(删除托盘图标);pnid 参数表示托盘图标的信息。在这个示例代码中,SendMessageToTray 方法用于向托盘程序发送消息,uID 参数表示托盘图标的 ID,uMsg 参数表示要发送的消息 ID。 注意,在使用 Shell_NotifyIcon 函数时,必须先将 NOTIFYICONDATA 结构体的 cbSize 字段设置为结构体的大小,以便系统识别结构体的大小。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值