![]() 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. 程序的運行測試:運行程序后,配置參數界面如下: ![]() 若有新郵件,精靈吉尼就會冒出來向你報告。 ![]() (在這里下載源碼文件) |
溫馨提示:喜歡本站的話,請收藏一下本站!