2. 设计主界面和精灵界面:先将主窗体的ShowInTaskbar属性设置为false,FormBorderStyle属性设置为FixedDialog,Text属性设置为“配置参数”。再在主窗体上添加五个标签控件(Label Control)、五个文本框控件(TextBox Control)、两个按钮控件(Button Control)、一个系统托盘控件(NotifyIcon Control)、一个上下文菜单控件(ContextMenu Control)以及一个时钟控件(Timer Control)。对各个控件进行属性设置:将五个标签的Text属性分别设置为“邮件服务器地址:”、“服务器端口:”、“用户名:”、“密码:”、“时间间隔(毫秒):”;将五个文本框的Name属性分别设置为:“ServerAdd”、“ServerPort”、“Username”、“Password”、“TimeSpan”;将前四个文本框的Text属性均设置为空,将最后一个的设置为300000(因为我们默认的时间间隔为5分钟);还有把第四个文本框的PasswordChar属性设置为“*”,这样输入的时候就隐藏了密码;把按钮控件的Text属性设置为“隐藏”和“检查邮件”;将系统托盘的Icon属性设置为一个图标文件;在上下文菜单下添加三个子项“配置参数”、“检查邮件”、“退出”。这样主界面已经设计完毕,图示如下: 接着设计精灵界面。我们用到的精灵是用Microsoft Agent创建的,它是完全居于COM的,所以我们可以很方便的利用它。有关它的详细信息,可以参考微软网站上的资料,网址为:http://www.microsoft.com/msagent/downloads.htm。先从那里下载以下一些东西:(1)Microsoft Agent核心组建(2) Microsoft Agent的精灵:吉尼(Genie)、么林(Merlin)、罗比(Robby)和皮蒂(Peedy)(3)至少有一个英语的Text-to-Speech引擎(现在还找不到中文的)(4)微软运行时发音API4.0a有了这些,我们就可以在我们的任何程序中应用了,只要在程序中添加此ActiveX控件即可。我们先添加一个新的窗体Form2,图示如下: 在新添加的窗体上我们要用到Microsoft Agent这个控件,于是就导入它到该工程中,图示如下: 现在,我们的工具箱里已经有了相应的控件,我们就可以直接使用了。(在程序运行时这个控件是不可见的)3. 重要的代码部分:在主窗体的代码部分,因为我们要用到网络以及网络流等类的对象,所以首先得添加以下几个重要的名字空间(Namespace):using System.Net; using System.Net.Sockets; using System.IO; using System.Text;接着,给我们的类添加一个NetworkStream对象来控制网络中的流。private NetworkStream netStream;给该类的构造函数添加如下代码,设置时钟的时间间隔以及使程序一开始就不可见而只有系统托盘。 timer1.Interval=Int32.Parse(TimeSpan.Text);//设定时间间隔 this.Opacity=0;//使窗体不可见我们用到一个重要的函数EmailCheck()。这个函数先新建一个TcpClient对象进行网络连接,用一个try-catch设法连接到用户输入的邮件服务器。如果连接成功,则用netStream对象取得网络流:netStream = tcpClient.GetStream();最后完成信息的发送和获取。函数如下:private void EmailCheck() { //新建一个TcpClient对象来建立连接 TcpClient tcpClient = new TcpClient(); try { tcpClient.Connect(ServerAdd.Text,Int32.Parse(ServerPort.Text)); } catch { MessageBox.Show("不能连接到主机:"+ServerAdd.Text+"和端口:"+ServerPort.Text); } //从邮件服务器获得相应 netStream = tcpClient.GetStream(); if(netStream == null) { throw new Exception("获得的网络流为空值。"); } string returnMsg=ReadFromNetStream(ref netStream); checkForError(returnMsg); //发送用户名信息 WriteToNetStream(ref netStream, "USER " + this.Username.Text); returnMsg=ReadFromNetStream(ref netStream); checkForError(returnMsg); //发送密码信息 WriteToNetStream(ref netStream, "PASS " + this.Password.Text); returnMsg=ReadFromNetStream(ref netStream); checkForError(returnMsg); Stat(); netStream.Close(); tcpClient.Close(); }上面的函数中用到了ReadFromNetStream()、WriteToNetStream()、Stat()、checkForError()等函数。ReadFromNetStream()是用来从网络流中读取信息的,带一个类型为ref NetworkStream的参数;WriteToNetStream()是向网络流中写入信息的,带两个类型为ref NetworkStream,string的参数;Stat()是当检查到新邮件后用来向用户报告信息的函数;checkForError()是进行查错的,带一个String类型的参数。四个函数如下:/// /// 这个函数用来显示新邮件数信息 /// public void Stat() { WriteToNetStream(ref netStream, "STAT"); string returnMsg=ReadFromNetStream(ref netStream); checkForError(returnMsg); //将总邮件数和邮件大小分离 string[] TotalStat= returnMsg.Split(new char[] {' '}); int count =Int32.Parse(TotalStat[1]); int totalSize=Int32.Parse(TotalStat[2]); //调用精灵,告知用户新邮件数 Form2 agent= new Form2(count); } /// /// 这个函数用来向网络流写入数据 /// /// /// private void WriteToNetStream(ref NetworkStream NetStream, string Command) { string stringToSend = Command + "\r\n"; Byte[] arrayToSend = Encoding.ASCII.GetBytes(stringToSend.ToCharArray()); NetStream.Write(arrayToSend, 0, arrayToSend.Length); } /// /// 这个函数用来从网络流中读取数据 /// /// /// private String ReadFromNetStream(ref NetworkStream NetStream) { StringBuilder strReceived= new StringBuilder(); StreamReader sr= new StreamReader(NetStream); String strLine = sr.ReadLine(); while(strLine==null strLine.Length==0) { strLine = sr.ReadLine(); } strReceived.Append(strLine); if(sr.Peek()!=-1) { while ((strLine=sr.ReadLine())!=null) { strReceived.Append(strLine); } } return strReceived.ToString(); } /// /// 这个函数用来检测网络流中的错误 /// /// private void checkForError(String strMessage) { if (strMessage.IndexOf("+OK") == -1) throw new Exception("ERROR - . Received: " + strMessage); }对于主窗体,我们还要添加各类事件处理函数,这样程序就可以工作了。各函数如下: private void menuItem1_Click(object sender, System.EventArgs e) { this.Opacity=100;//使窗体可见 } private void menuItem2_Click(object sender, System.EventArgs e) { this.EmailCheck();//检查是否有新邮件 } private void menuItem3_Click(object sender, System.EventArgs e) { this.Close();//退出程序 } private void button1_Click(object sender, System.EventArgs e) { this.Opacity=0;//使窗体不可见 } private void button2_Click(object sender, System.EventArgs e) { this.EmailCheck();//检查是否有新邮件 } private void timer1_Tick(object sender, System.EventArgs e) { this.EmailCheck();//检查是否有新邮件 }在新建窗体的代码部分,主要是导入精灵并运用精灵向用户报告新邮件数等的处理问题。程序中,只要修改该类的构造函数即可: public Form2(int EmailNumber) { // // Required for Windows Form Designer support // InitializeComponent(); // // TODO: Add any constructor code after InitializeComponent call // //你可以从下面的地址下载 //http://www.microsoft.com/msagent/downloads.htm // axAgent1.Characters.Load("Genie","Genie.acs");//导入精灵吉尼(Genie) AgentObjects.IAgentCtlCharacterEx genie=axAgent1.Characters["Genie"]; //genie的语言ID =1033,为英语 genie.Show(false); genie.Speak("You Have "+ EmailNumber.ToString()+" emails",""); genie.Think("Should I Leave or Stay, Himmm!!!!"); genie.Hide(true); }注意:genie的语言ID为1033,对应于英语,现在还不支持中文。4. 程序的运行测试:运行程序后,配置参数界面如下: 若有新邮件,精灵吉尼就会冒出来向你报告。 (在这里下载源码文件) |
温馨提示:喜欢本站的话,请收藏一下本站!