C#下实现动态系统托盘图标

动态

Visual C#是微软公司推出的下一代程序开发语言,是微软.Net框架中的的一个重要组成部分。微软的.Net平台堪称为新一代的互联网平台。对于技术开发人员来说,.Net平台的两大特性是非常卓越的,首先是其所提供的公共语言运行时,也就是公用语言运行平台,另一方面就是其庞大而全面的统一编程类。Visual C#就是通过调用这些类、对象来实现许多比较强大的功能。

本文通过向大家介绍一个.Net平台上用C#写的可以停放在任务栏上的图标程序(类似于Flashget、OICQ那种系统托盘图标)来和大家一起体验一下用C#编程的乐趣。

一、概述:

我这里所指的图标程序是类似于在Windows中经常接触的停放在任务栏上,在后台运行的病毒监视、媒体播放等程序。它们一般都具有单击显示或隐藏主界面,击右键弹出菜单,当鼠标停在图标上时显示提示信息的功能。

程序主要用到了一下几个类:

System.Windows.Fomrs.NotifyIcon类
System.Windows.Forms.ContextMenu类
System.Windows.Forms.MenuItem类
System.Windows.Forms.Label类
System.Windows.Forms.Timer类

二、程序设计和运行的环境:

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

(2).Net FrameWrok SDK Beta 2版

三、具体实现步骤:

(1).在Visual Studio下新建一个C#的工程,不妨命名为AnimateSystemTray。图示如下:


(2).现在我们来设计程序的主界面:

先将窗体的Text属性设置为"动画系统图标示例",MaximiseBox、MinimiseBox、ShowInTaskbar属性均设置为False。

再往窗体上添加Label控件、NotifyIcon控件、ContextMenu控件、Timer控件各一个。

将Label控件的Text属性设置为"请右击系统托盘图标";将NotifyIcon控件的Icon属性设置为一个图标文件: ,Text属性设置为"这是个示例程序!",ContextMenu属性设置为"contextMenu1";接下来开始编辑ContextMenu控件,图示如下:

最后还要在导入两个图标 (Icon1.ico), (Icon2.ico)文件到该项目。
(3).现在我们开始编写代码部分:

首先在我们的类中添加以下数据成员:

private Icon m_Icon1;
private Icon m_Icon2;
private bool m_bFlag;
private bool m_bShowWnd;

修改Form1()函数为:

public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
//
// TODO: Add any constructor code after InitializeComponent call
//
m_bFlag=true;
m_bShowWnd=true;

try
{
m_Icon1 = new Icon("Icon1.ico");//导入图标文件
m_Icon2 = new Icon("Icon2.ico");
}
catch ( Exception e )
{
MessageBox.Show("Error " + e.Message,"Animate Tray - Error");
menuItem2.Enabled = false;
menuItem3.Enabled = false;
}
}

添加menuItem1、menuItem2、menuItem3、m_trayIcon的Click事件,消息处理函数如下:
private void menuItem1_Click(object sender, System.EventArgs e)
{
timer1.Start();//打开计时器
}

private void menuItem2_Click(object sender, System.EventArgs e)
{
timer1.Stop();//停止计时器
}

private void menuItem3_Click(object sender, System.EventArgs e)
{
Application.Exit();//退出应用程序
}

private void m_trayIcon_Click(object sender, System.EventArgs e)
{
if(m_bShowWnd == true)//隐藏主界面
{
this.Visible = false;
m_bShowWnd = false;
}
else//显示主界面
{
this.Visible = true;
m_bShowWnd = true;
}
}

最后还要添加timer1的Tick()函数:

private void timer1_Tick(object sender, System.EventArgs e)
{
if ( m_Icon1 != null && m_Icon2 != null ) //如果两个图标文件都被正确载入
{
//只要timer1被启动,则在两个图标之间不断进行选择变换,实现动画效果
if ( m_bFlag == true )
{
m_trayIcon.Icon = m_Icon2;
m_bFlag = false;
}
else
{
m_trayIcon.Icon = m_Icon1;
m_bFlag = true;
}
}
}

好了,按Ctrl+F5试试效果吧!

运行程序,将显示一个主窗口,此时还可以看到在任务栏上面多了一个图标。当鼠标移到其上停留一下时,将显示一个简单的提示信息,点击该图标则将隐藏主窗口,单击右键,出来一个菜单,选"动画图标开始"和"动画图标结束"可以控制图标状态。

四.总结:

做完这个程序,我们不难发现用C#做一些运用程序效果是非常方便的。以前我在SDK、MFC下,用到了Shell_NotifyIcon()、TrackPopMenu()以及DestroyMenu(),还要自己添加消息处理函数,工作量是非常大的。现在微软为我们做好了这些工作,是不是很方便?快快加入C#的行列吧。

(责任编辑 尤北 lvye@staff.ccidnet.com)

时间: 2025-01-30 11:19:53

C#下实现动态系统托盘图标的相关文章

wince-WinCE6.0下AddFontResource动态加载黑体字库,导致CE系统的汉字消失,怎么解决?

问题描述 WinCE6.0下AddFontResource动态加载黑体字库,导致CE系统的汉字消失,怎么解决? WinCE6.0下AddFontResource动态加载黑体字库,导致CE系统的汉字消失,怎么解决? 解决方案 以下测试在模拟器上进行在我们的真机也是同样现象1. 首先打开模拟器2. 运行测试程序测试程序为新建一个MFC基于对话框的工程添加一个按钮caption是测试并且添加按钮按下的代码C/C++ codevoid CTestFont2Dlg::OnBnClickedButton1(

WinCE6.0下如何动态设置系统分辨率

      由于WinCE的显示驱动是本地驱动,不能像流驱动一样动态加载.所以,一般情况下不能动态修改和调试.前两天曾介绍过一种在应用程序中针对相同分辨率但不同尺寸的LCD的调试方法.这里继续介绍WinCE6.0下动态设置系统分辨率的一种方法.我们可以通过系统提供的ChangeDisplaySettingsEx()函数实现动态修改系统的分辨率.       设定系统分辨率的参考代码如下:  1     DWORD dwWidth, dwHeight; 2     DEVMODE dm; 3  4

Linux系统下的动态DNS服务配置方法详解

在网络管理中,对于DNS服务的管理是一项基础性的工作.随着用户规模的扩大,频繁地手工修改DNS的区域数据库文件不是一件轻松的工作.关于动态DNS(DDNS)的研究逐渐引起了人们的关注,不同的平台都推出了自己的解决方案.本文将详细介绍Linux环境下DDNS的解决方案,即由Internet Software Consortium(ISC)开发的BIND-DNS和DHCP(Dynamic Host Configure Protocol,动态主机配置协议)协同工作,进而共同实现DDNS的方法. 在Li

Inno Setup 系统托盘图标插件 TrayIconCtrl V1.5

原文 http://restools.hanzify.org/article.asp?id=93 V1.5 修正在某些 Windows 平台上(例如 Windows XP SP3)不能正常运行的问题.  引用来自 trayiconctrl.iss,2009-10-16 21:06:53 ; -- trayiconctrl.iss --; restools; http://restools.hanzify.org; TrayIconCtrl.dll 为一个用于 Inno Setup 的 15.5

如何使用pptp在ubuntu下搭建动态ip的vpn

问题描述 如何使用pptp在ubuntu下搭建动态ip的vpn 刚接触linux和vpn,很多东西搞不明白,按照百度的资料操作也有很多东西搞不懂,现在也没搭出来,希望各位指教 已有条件是这样的 用来作为服务器的电脑系统为ubuntu 14.04.3,内网ip为192.168.1.100,外网为动态ip 准备使用pptp进行搭建 问题主要是以下几点 1.看到的资料都需要把dns设置为google的8.8.8.8和8.8.4.4,可我只需要国内的远程登录.还需要设置境外的dns么?如果需要设置境内的

linux下so动态库一些不为人知的秘密(中二)

继续上一篇< linux下so动态库一些不为人知的秘密(中) >介绍so搜索路径,还有一个类似于-path,叫LD_RUN_PATH环境变量, 它也是把路径编译进可执行文件内,不同的是它只设置RPATH.  [stevenrao] $ g++ -o demo -L /tmp/  -ltmp main.cpp  [stevenrao] $ readelf -d demo  Dynamic section at offset 0xb98 contains 25 entries:   Tag    

在Win2000下实现动态DNS的安全考虑

在Windows 2000下,动态DNS是与DHCP.WINS及活动目录(AD)集成在一起的.在Windows 2000的域下有三种实现DNS的方法:与活动目录集成.与活动目录集成的主DNS及不与活动目录集成的辅助DNS.不与活动目录集成的主DNS及不与活动目录集成的辅助DNS.当DNS完成集成到活动目录中后,我们可以利用Windows2000网络中的三个重要安全特性:安全动态更新.安全区域传输.对区域和资源记录的访问控制列表. 1.0 安全动态更新 在动态DNS(DDNS)中一个最重要的安全特

如何使用线程局部存储实现多线程下的日志系统

概述 通常来说,在应用程序中需要日志来记录程序运行的状态,以便后期问题的跟踪定位.在日志系统的设计中,通常会有一个总的日志系统来统一协调这些日志的设置如位置.输出级别和内容等.在多线程编程中,当每个线程都需要输出日志时,因为要考虑线程间的同步,日志系统的设计更加复杂. 在单线程应用程序中,通常使用一个日志单例向某个文件输出应用运行过程中的重要日志信息,但是在多线程环境中,这样做显然不好,因为各个线程打印出的日志会错综复杂从而使得日志文件不容易阅读和跟踪.比较好的办法是主线程记录自己的日志,各个子

使用jqMobi开发app基础:Scrolling的使用,向上向下拖动,动态添加数据

官网上Scrolling写的很简单.但自己要使用,却得试验很多次.     例如要实现如下简单的功能:也就是动态加载数据,不管用户向上拖动还是向下拖动,都动态加载数据. 开发app基础:Scrolling的使用,向上向下拖动,动态添加数据-"> 第一步自然是研究demo了.demo一开始就有很多内容. 对应的脚本也很简单: <script> var myScroller; $.ui.ready(function () { myScroller = $("#websli