C#邮件接收系统核心代码(接收POP3邮件IMAP邮件)

/*
 * Created by SharpDevelop.
 * User: Administrator
 * Date: 2013/11/18
 * Time: 20:55
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using System.Linq;
using System.IO;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Collections; 
using System.Text;


using LumiSoft.Net;
using LumiSoft.Net.Log;
using LumiSoft.Net.MIME;
using LumiSoft.Net.Mail;
using LumiSoft.Net.IMAP;
using LumiSoft.Net.IMAP.Client;
using LumiSoft.Net.POP3.Client;

//热键
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
using System.Runtime.InteropServices;
using System.Reflection;
using System.Collections.Generic;


//sqlite数据库驱动组件
using System.Data.SQLite;

//多线程
using System.Threading;

//MD5加密
using System.Security.Cryptography;

using System.Diagnostics;

using CS;

namespace mail
{
	/// <summary>
	/// Description of MainForm.
	/// </summary>
	///

	//主函数类
	public partial class MainForm : Form
	{	
		Hook m_hook = new Hook();

		public static string thisuser="";
		public static int threadstate=0;
		 private IMAP_Client m_pImap = null;
		 public static string PREmail="";
		 public static string PRPro="";
		 public static ArrayList list = new ArrayList();
		 public class client
		 {
			public string ip;
			public string usr;
			public string pass;
			public string serverport;
			public int port;
			public string ssl;
			public string pro;
		 	public int time;
		 	public int DEAD;
		 }
		 public static string global_user="";
		 public static string folder="";
		 public static int global_type=1;
		 //邮件账户书目
		 public static int num=0;
		 static client[] zhanghu=new client[10];
		 //有效账号
		 public static int mail_able=0;
		 public static int mail_unable=0;
		 
		 //邮件总数目
		 public static int emlnum=0;
		 
		 //自己主动收信总时间
		 public string auto;
		 
		 //imap收信起始时间
		 public static string imap_start;
		 public static string imap_end;
		 
		 //IMAP收信件数
		 public static int imapnum=0;
		 public static int imapfirst=0;
		 //存放imap邮箱中未读邮件的数目
		 public int imap_unread=0;
		public  string MD5(string encryptString)
        {
            byte[] result = Encoding.Default.GetBytes(encryptString);
            MD5 md5 = new MD5CryptoServiceProvider();
            byte[] output = md5.ComputeHash(result);
            string encryptResult = BitConverter.ToString(output).Replace("-", "");
            return encryptResult;
        }
		//下载邮件函数
		private void m_pImap_Fetch_MessageItems_UntaggedResponse(object sender,EventArgs<IMAP_r_u> e)
		{
          try{
                if(e.Value is IMAP_r_u_Fetch){
                IMAP_r_u_Fetch fetchResp = (IMAP_r_u_Fetch)e.Value;

                this.BeginInvoke(new MethodInvoker(delegate(){
                try
                {
					fetchResp.Rfc822.Stream.Position = 0;
                    Mail_Message mime = Mail_Message.ParseFromStream(fetchResp.Rfc822.Stream);
                    fetchResp.Rfc822.Stream.Dispose();  
                    
					//假设不超出时间范围则
					if(string.Compare(imap_end,imap_start)<=0 || (string.Compare(mime.Date.ToString("yyyy年MM月dd日 HH时mm分"),imap_start)>0 && string.Compare(mime.Date.ToString("yyyy年MM月dd日 HH时mm分"),imap_end)<0))
					{
						string from = "";
		            	if(fetchResp.Envelope.From != null)
		            	{
					    	for(int i=0;i<fetchResp.Envelope.From.Length;i++)
					    	{
								// Don't add ; for last item
								if(i == fetchResp.Envelope.From.Length - 1)
								{
									from += fetchResp.Envelope.From[i].ToString();
								}
								else
								{
									from += fetchResp.Envelope.From[i].ToString() + ";";
								}
							}
				        }
                        else
                        {
                        	from = "<none>";
                        }
                          
                        //写入文件
                        //截取邮件标题
						str stringhandle=new str();
						string title=from.ToString()+"#"+stringhandle.strlen(fetchResp.Envelope.Subject.ToString(),20)+"#"+fetchResp.InternalDate.Date.ToString("yyyy年MM月dd日 HH时mm分")+"#"+(fetchResp.Rfc822Size.Size / (decimal)1000).ToString("f2") + " kb#";
                        title=FilterSpecial(title);
                        cstring mystring=new cstring();
                        title=mystring.ENCODE(title);
						title+=".eml";	
						//写入eml文件
                        string filepro=Application.StartupPath+"\\data\\"+thisuser+"\\"+global_user+"\\"+folder+"\\"+title;
                        
                        //假设文件不存在,则下载,而且显示到控件中
                        if(!File.Exists(@filepro))
                       {
                        
							try
							{
								FileStream fs = new FileStream(filepro, FileMode.Create);//文件名称和路径
				                StreamWriter sw = new StreamWriter(fs);
							    //開始写入
							    sw.Write(mime);					        
							    //清空缓冲区
							    sw.Flush();
							    //关闭流
							    sw.Close();
							    fs.Close();			
							}
							catch(Exception x)
							{
								//写入日志
						   		this.listBoxOUTPUT.Items.Add(log("all",thisuser,"eml文件",x.Message));
							}
                        			
							//列表显示							    
							if(global_type==1)
                            {
	                            ListViewItem currentItem = new ListViewItem();
	                            currentItem.ImageIndex = 0;
	                            currentItem.Tag = fetchResp.UID.UID;
	                            currentItem.Text = from;
	                            //截取邮件标题
								str stringhandle1=new str();
								currentItem.SubItems.Add(stringhandle1.strlen(fetchResp.Envelope.Subject != null ? fetchResp.Envelope.Subject : "<none>",20));
	                            currentItem.SubItems.Add(fetchResp.InternalDate.Date.ToString("yyyy.MM.dd HH:mm"));
	                            currentItem.SubItems.Add(((decimal)(fetchResp.Rfc822Size.Size / (decimal)1000)).ToString("f2") + " kb");
	                            //加入到控件中
	                            this.listView.Items.Add(currentItem);
                           	 }						        
                       }
                        	//MessageBox.Show("12");
					}
				}
                        catch(Exception x){
                           //写入日志
						   this.listBoxOUTPUT.Items.Add(log("all",thisuser,"eml文件",x.Message));
                        }
                    }));                    
                }
            }
            catch(Exception x){
                //写入日志
				this.listBoxOUTPUT.Items.Add(log("all",thisuser,"连接IMAP出错",x.Message));
            }   
            
        }
		//yahoo专用
		//下载邮件函数
		private void m_pImap_Fetch_MessageItems_UntaggedResponseyahoo(object sender,EventArgs<IMAP_r_u> e)
		{
          try{
                if(e.Value is IMAP_r_u_Fetch){
                IMAP_r_u_Fetch fetchResp = (IMAP_r_u_Fetch)e.Value;

                this.BeginInvoke(new MethodInvoker(delegate(){
                try
                {
                    
					//假设不超出时间范围则
					if(string.Compare(imap_end,imap_start)<=0 || (string.Compare(fetchResp.InternalDate.Date.ToString("yyyy年MM月dd日 HH时mm分"),imap_start)>0 && string.Compare(fetchResp.InternalDate.Date.ToString("yyyy年MM月dd日 HH时mm分"),imap_end)<0))
					{
						string from = "";
		            	if(fetchResp.Envelope.From != null)
		            	{
					    	for(int i=0;i<fetchResp.Envelope.From.Length;i++)
					    	{
								// Don't add ; for last item
								if(i == fetchResp.Envelope.From.Length - 1)
								{
									from += fetchResp.Envelope.From[i].ToString();
								}
								else
								{
									from += fetchResp.Envelope.From[i].ToString() + ";";
								}
							}
				        }
                        else
                        {
                        	from = "<none>";
                        }

                        			
							//列表显示							    
							if(global_type==1)
                            {
	                            ListViewItem currentItem = new ListViewItem();
	                            currentItem.ImageIndex = 0;
	                            currentItem.Tag = fetchResp.UID.UID;
	                            currentItem.Text = from;
	                            //截取邮件标题
								str stringhandle1=new str();
								currentItem.SubItems.Add(stringhandle1.strlen(fetchResp.Envelope.Subject != null ? fetchResp.Envelope.Subject : "<none>",20));
	                            currentItem.SubItems.Add(fetchResp.InternalDate.Date.ToString("yyyy.MM.dd HH:mm"));
	                            currentItem.SubItems.Add(((decimal)(fetchResp.Rfc822Size.Size / (decimal)1000)).ToString("f2") + " kb");
	                            //加入到控件中
	                            this.listView.Items.Add(currentItem);
                           	 }						        
                       
                        	//MessageBox.Show("12");
					}
				}
                        catch(Exception x){
                           //写入日志
						   this.listBoxOUTPUT.Items.Add(log("all",thisuser,"eml文件",x.Message));
                        }
                    }));                    
                }
            }
            catch(Exception x){
                //写入日志
				this.listBoxOUTPUT.Items.Add(log("all",thisuser,"连接IMAP出错",x.Message));
            }   
            
        }
		//IMAP邮件接收函数
		public void ReceiveIMAP(string serverport,string SSL,string PRO,string POP3Server,string UserName,string PassWord,string start,string end,int type,string first,string boxname)
		{
			//设置是否显示到列表中
			global_type=type;
			//開始建立
			try
			{
				//写入日志
				this.listBoxOUTPUT.Items.Add(log("imap",thisuser,"開始连接IMAP服务器 "+UserName,"OK"));
				IMAP_Client imap = new IMAP_Client();
				imap.Logger = new Logger();
				imap.Connect(POP3Server,int.Parse(serverport),(Convert.ToBoolean(string.Compare(SSL,"SSL")==0)));
				imap.Login(UserName,PassWord);
				//写入日志
				this.listBoxOUTPUT.Items.Add(log("imap",thisuser,"连接IMAP服务器成功"+UserName,"OK"));
				folder=boxname;					
				m_pImap=imap;
									
				listView.Items.Clear();
				this.Cursor = Cursors.WaitCursor;
			
				m_pImap.SelectFolder(boxname);
				string total="";
				if(int.Parse(first)>0)
				{
					total="1:"+first;
				}
				else
				{
					total="1:*";
				}
				//開始循环取邮件数据                
				m_pImap.Fetch(
				              false,
				              IMAP_t_SeqSet.Parse(total),
				              new IMAP_t_Fetch_i[]{
				              new IMAP_t_Fetch_i_Envelope(),
				              new IMAP_t_Fetch_i_Flags(),
				              new IMAP_t_Fetch_i_InternalDate(),
				              new IMAP_t_Fetch_i_Rfc822Size(),
				              new IMAP_t_Fetch_i_Uid(),
				              new IMAP_t_Fetch_i_Rfc822()
				              },
				              this.m_pImap_Fetch_MessageItems_UntaggedResponse
				                );
		    }
		    catch(Exception x)
			{
				//写入日志
				this.listBoxOUTPUT.Items.Add(log("imap",thisuser,"连接IMAP出错",x.Message));
			}
		}
		//POP3邮件接收函数
		public void ReceiveMail(string serverport,string SSL,string PRO,string POP3Server,string UserName,string PassWord,string start,string end,int type,string first)
		{
			//进程開始
			threadstate=1;
			//写入日志
			this.listBoxOUTPUT.Items.Add(log("pop3",thisuser,"開始连接POP3服务器 "+UserName,"OK"));
			//定义一个pop3client
				POP3_Client _POP3Client=new POP3_Client();
				Mail_Message mime;
				Mail_Message mime1;
				bool is_ssl;
			  	//定义存放每个邮箱中邮件uid的文件名称
				string uidstorage="data\\"+thisuser+"\\"+UserName+"\\"+UserName+".log";
				//保存未读邮件数
				int couter=0;
				//保存已读取的邮件数
				int read_count=0;
				int READ=int.Parse(first);
				try
				{
					int int_serverport = 0;
	                int.TryParse(serverport, out int_serverport);
					if(SSL=="SSL")
						is_ssl=true;
					else
						is_ssl=false;
					//连接client服务器以及验证客户身份
					_POP3Client.Connect(POP3Server,int_serverport,is_ssl);
					_POP3Client.Authenticate(UserName,PassWord,true);
					this.listBoxOUTPUT.Items.Add(log("pop3",thisuser,"POP3服务器验证成功","OK"));
					//创建或打开存放邮件uid的文件
					FileStream fs1=new FileStream(uidstorage, FileMode.OpenOrCreate);
	                fs1.Close();
	                //定义一个读文件指针
				    FileStream file3= new FileStream(uidstorage, FileMode.Open);
				    StreamReader sr=new StreamReader(file3);
				    file3.Close();
	                sr.Close();
				    sr.Dispose();
				    var q=(from POP3_ClientMessage x in _POP3Client.Messages select x).OrderBy(x=>-x.SequenceNumber);  
				     string strLine;
				     foreach(POP3_ClientMessage message in  q) 
				     {
				        file3= new FileStream(uidstorage, FileMode.Open);
	                    sr=new StreamReader(file3);
				     	string ss = message.UID;
				     	//检查邮件的uid是否已经保存在相应邮箱的uid文件里
	                    strLine=sr.ReadLine();
	                    while(strLine!=null)
	                    {	 
	                    	if(strLine==ss)
	                    		break;
	                    	strLine=sr.ReadLine();
	                    }
	                    file3.Close();
	                    sr.Close();
				    	sr.Dispose();
	                    //uid不在文件里,则未读邮件数加一
	                    if(strLine==null)
	                    {
	                        StreamWriter sw1=new StreamWriter(uidstorage,true);
	                        try
	                        {
				              //提取每封邮件的头部并输出“邮件主题,发送者,发送时间以及邮件的大小”
				              mime=Mail_Message.ParseFromByte(message.HeaderToByte());
				    		 //满足时间条件就下载邮件
				    		if(string.Compare(end,start)<=0 || (string.Compare(mime.Date.ToString("yyyy年MM月dd日 HH时mm分"),start)>0 && string.Compare(mime.Date.ToString("yyyy年MM月dd日 HH时mm分"),end)<0))
				    		{
				    			if(type==1)
				    			{
				    				//定义一个列表
									ListViewItem currentItem = new ListViewItem();
	            					currentItem.ImageIndex = 0;
				    				currentItem.Text = mime.From.ToString();
				    				//截取邮件标题
									str stringhandle=new str();
									currentItem.SubItems.Add(stringhandle.strlen(mime.Subject.ToString(),20));
					    			currentItem.SubItems.Add(mime.Date.ToString("yyyy年MM月dd日 HH时mm分"));
					    			currentItem.SubItems.Add((message.Size/1024).ToString()+"KB");
					    			//加入到控件中
		                			listView.Items.Add(currentItem);
				    			}
	
				            	//将未读邮件的uid存放到相应的文件里
				    	        read_count++;
				    	        sw1.WriteLine(ss);
				                sw1.Close();
		                		//写入eml文件
		                		Random ran=new Random(unchecked((int)DateTime.Now.Ticks));		
								int RandKey=ran.Next(0,1000000000);
								
								//截取邮件标题
								str stringhandle2=new str();
								string title=mime.From.ToString()+"#"+stringhandle2.strlen(mime.Subject.ToString(),20)+"#"+mime.Date.ToString("yyyy年MM月dd日 HH时mm分")+"#"+(message.Size/1024).ToString()+"KB#";
	                            title=FilterSpecial(title);
	                            //对文件名称进行BASE64加密
	                        	cstring mystring=new cstring();
                        		title=mystring.ENCODE(title);
								title+=".eml";	 
								string file=Application.StartupPath+"\\data\\"+thisuser+"\\"+UserName+"\\收件箱\\"+title;
		                		
								//写入eml文件
								FileStream fs = new FileStream(file, FileMode.Create);//文件名称和路径
			                    StreamWriter sw = new StreamWriter(fs);
						        sw.Write(mime);
						        sw.Flush();
						        sw.Close();
						        fs.Close();
						        
						        mime1=Mail_Message.ParseFromByte(message.MessageToByte());
						        if(mime1.Attachments.Length!=0)
						        	Directory.CreateDirectory(Application.StartupPath+"\\data\\"+thisuser+"\\"+UserName+"\\收件箱\\"+RandKey.ToString()+".eml附件");
				    		  //下载邮件的每个附件
						        for(int i=0;i<mime1.Attachments.Length;i++)
						        {
						        	Stream decodedDataStream = ((MIME_b_SinglepartBase)mime1.Attachments[i].Body).GetDataStream();
	                                string file1 =Application.StartupPath+"\\data\\"+thisuser+"\\"+UserName+"\\收件箱\\"+RandKey.ToString()+".eml附件"+"\\"+ mime1.Attachments[i].ContentType.Param_Name;
	                                using (FileStream fs2 = File.Create(file1))
	                                {
	                                	LumiSoft.Net.Net_Utils.StreamCopy(decodedDataStream, fs2, 4000);
	                                }
						        }
						        
				    		}
	                        }
	                        catch
	                        {
	                        	continue;
				            }  	
	                    }//if
	                    if(read_count==READ)
				   			break;
				     }//foreach
				     _POP3Client.Disconnect();
				}//try
				catch(Exception x)
				{
					//无法连接,加入到失败栏目
					string sql = "UPDATE profile SET STATE='0' WHERE USERNAME='"+UserName+"' AND PRO='"+PRO+"'";
					//插入到数据库
					SQLquery(sql);
					//加入到错误列表
					if(this.treeView.SelectedNode.Parent==null)
	                this.treeView.SelectedNode.ForeColor=Color.Red;
					else
					this.treeView.SelectedNode.Parent.ForeColor=Color.Red;						
					//写入日志
					this.listBoxOUTPUT.Items.Add(log("pop3",thisuser,"连接POP3服务器出错 "+UserName,x.Message));
				}
			//进程结束
			threadstate=0;
		}   
		

        private void m_pImap_Fetch_MessageItems_UntaggedResponse_1(object sender,EventArgs<IMAP_r_u> e)
        {
            /* NOTE: All IMAP untagged responses may be raised from thread pool thread,
                so all UI operations must use Invoke.
             
               There may be other untagged responses than FETCH, because IMAP server
               may send any untagged response to any command.
            */

            try{
                if(e.Value is IMAP_r_u_Fetch){
                    IMAP_r_u_Fetch fetchResp = (IMAP_r_u_Fetch)e.Value;

                    this.BeginInvoke(new MethodInvoker(delegate(){
                        try{
                            //ListViewItem currentItem = new ListViewItem();
                           // currentItem.ImageIndex = 0;
                           // currentItem.Tag = fetchResp.UID.UID;
							//fetchResp.Rfc822.Stream.Position = 0;
                           // Mail_Message mime = Mail_Message.ParseFromStream(fetchResp.Rfc822.Stream);
                           // fetchResp.Rfc822.Stream.Dispose();  
                            string from = "";
		                    if(fetchResp.Envelope.From != null){
				                for(int i=0;i<fetchResp.Envelope.From.Length;i++){
						            // Don't add ; for last item
						            if(i == fetchResp.Envelope.From.Length - 1){
							            from += fetchResp.Envelope.From[i].ToString();
						            }
						            else{
							            from += fetchResp.Envelope.From[i].ToString() + ";";
						            }
					            }
				            }
                            else{
                                from = "<none>";
                            }
                           // currentItem.Text = from;
                           //MessageBox.Show(from);

                           // currentItem.SubItems.Add(fetchResp.Envelope.Subject != null ? fetchResp.Envelope.Subject : "<none>");

                            //currentItem.SubItems.Add(fetchResp.InternalDate.Date.ToString("dd.MM.yyyy HH:mm"));

                           // currentItem.SubItems.Add(((decimal)(fetchResp.Rfc822Size.Size / (decimal)1000)).ToString("f2") + " kb");

                          //  m_pTabPageMail_Messages.Items.Add(currentItem);
                          	string title=from.ToString()+"#"+fetchResp.Envelope.Subject.ToString()+"#"+fetchResp.InternalDate.Date.ToString("yyyy年MM月dd日 HH时mm分")+"#"+(fetchResp.Rfc822Size.Size / (decimal)1000).ToString("f2") + " kb#";
                            title=FilterSpecial(title);
							title+=".eml";	
							//写入eml文件
                            string filepro=Application.StartupPath+"\\data\\"+global_user+"#IMAP\\INBOX\\"+title;
	                		FileStream fs = new FileStream(filepro, FileMode.Create);//文件名称和路径
		                    StreamWriter sw = new StreamWriter(fs);
					        //開始写入
					        sw.Write("12");					        
					        //清空缓冲区
					        sw.Flush();
					        //关闭流
					        sw.Close();
					        fs.Close();
                        }
                        catch(Exception x){
                            MessageBox.Show("Error: " + x.ToString(),"Error:",MessageBoxButtons.OK,MessageBoxIcon.Error);
                        }
                    }));                    
                }
            }
            catch(Exception x){
                MessageBox.Show("Error: " + x.ToString(),"Error:",MessageBoxButtons.OK,MessageBoxIcon.Error);
            }
        }
		
		
		
		 void OnHookKeyDown(KeyEventArgs e)
        {
            OnKeyDown(e);
            if (e.Handled)
            {
                return;
            }
            
             if (((Control.ModifierKeys & Keys.Shift) == Keys.Shift) && ((Control.ModifierKeys & Keys.Control) == Keys.Control)
                     && ((Control.ModifierKeys & Keys.Alt) == Keys.Alt))
            {

                if (!this.Visible)
                {
                    this.Show();
                }
            }
            
            /*
            if (e.KeyCode == Keys.F10)
            {
                this.Hide();
            }
            */
        }
		
		
		
		public MainForm()
		{
			//
			// The InitializeComponent() call is required for Windows Forms designer support.
			//
			InitializeComponent();
			CheckForIllegalCrossThreadCalls = false;
			ActiveHook.SetWindowPos(this.Handle, IntPtr.Zero, 0, 0, 1000, 620, ActiveHook.SWP_NOACTIVATE);
            m_hook.OnKeyDown += new Hook.KeyboardDelegate(OnHookKeyDown);
			//
			// TODO: Add constructor code after the InitializeComponent() call.
			
		}
		
		//数据库运行语句
		//插入数据库函数
		void SQLquery(string sql)
		{
			//打开数据库
			SQLiteConnection conn = new SQLiteConnection();
			SQLiteConnectionStringBuilder connstr = new SQLiteConnectionStringBuilder();
	        connstr.DataSource = "my.db";
	        conn.ConnectionString = connstr.ToString();
	        conn.Open();
	        //运行SQL语句    
	       	SQLiteCommand cmd = new SQLiteCommand();
	       	cmd.CommandText = sql;
	       	cmd.Connection = conn;
	       	cmd.ExecuteNonQuery();
	       	//关闭全部连接         
	       	connstr.Clear();
	       	conn.Close();
		}
				//加密解密算法
		public static string Encode(string str, string key)
		{
			DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
			provider.Key = Encoding.ASCII.GetBytes(key.Substring(0, 8));
			provider.IV = Encoding.ASCII.GetBytes(key.Substring(0, 8));
			byte[] bytes = Encoding.GetEncoding("GB2312").GetBytes(str);
			MemoryStream stream = new MemoryStream();
			CryptoStream stream2 = new CryptoStream(stream, provider.CreateEncryptor(), CryptoStreamMode.Write);
			stream2.Write(bytes, 0, bytes.Length);
			stream2.FlushFinalBlock();
			StringBuilder builder = new StringBuilder();
			foreach (byte num in stream.ToArray())
			{
			builder.AppendFormat("{0:X2}", num);
			}
			stream.Close();
			return builder.ToString();
		}
		public static string Decode(string str, string key)
		{
			DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
			provider.Key = Encoding.ASCII.GetBytes(key.Substring(0, 8));
			provider.IV = Encoding.ASCII.GetBytes(key.Substring(0, 8));
			byte[] buffer = new byte[str.Length / 2];
			for (int i = 0; i < (str.Length / 2); i++)
			{
			int num2 = Convert.ToInt32(str.Substring(i * 2, 2), 0x10);
			buffer[i] = (byte)num2;
			}
			MemoryStream stream = new MemoryStream();
			CryptoStream stream2 = new CryptoStream(stream, provider.CreateDecryptor(), CryptoStreamMode.Write);
			stream2.Write(buffer, 0, buffer.Length);
			stream2.FlushFinalBlock();
			stream.Close();
			return Encoding.GetEncoding("GB2312").GetString(stream.ToArray());
		}
		
		void TreeView1AfterSelect(object sender, TreeViewEventArgs e)
		{
			
		}
		
		//主窗口载入事件
		void MainFormLoad(object sender, EventArgs e)
		{
			 m_hook.SetHook(true); 
			//载入当前用户
			this.labelTHISUSER.Text=thisuser;
			//载入全局data目录
			if(!Directory.Exists("data"))Directory.CreateDirectory("data");
			//载入用户目录,假设存在则不创建,假设不存在则创建
			if(!Directory.Exists("data\\"+thisuser))Directory.CreateDirectory("data\\"+thisuser);
			//载入日志,假设存在则不创建,假设不存在则创建
			if(!Directory.Exists("log"))Directory.CreateDirectory("log");
			//假设不是admin用户 则隐藏用户管理选项
			if(thisuser!="admin")
			{
				this.用户加入ToolStripMenuItem.Visible=false;
			}
			
			
			/*载入定时器事件---------------------------------------*/
			int t=1000*60*15;
			try
			{
				string sql_config="select * from config where NAME='AUTO_TIME'";
				//打开数据库
				SQLiteConnection conn_config = new SQLiteConnection();
				SQLiteConnectionStringBuilder connstr_config = new SQLiteConnectionStringBuilder();
		        connstr_config.DataSource = "my.db";
		        conn_config.ConnectionString = connstr_config.ToString();
		        conn_config.Open();
		        //运行SQL语句    
		       	SQLiteCommand cmd_config = new SQLiteCommand();
		       	cmd_config.CommandText = sql_config;
		       	cmd_config.Connection = conn_config;
		       	SQLiteDataReader reader_config=cmd_config.ExecuteReader();
		       	
		       	while (reader_config.Read())
                {
		       		t=int.Parse(reader_config.GetString(2));
                }
		       	//关闭全部连接         
		       	connstr_config.Clear();
		       	conn_config.Close();
			}
			catch (Exception x)
			{
		        //写入日志
				this.listBoxOUTPUT.Items.Add(log("sqlite",thisuser,"定时器数据库连接出错 ",x.Message));
			}
			timerDOWNLOAD.Enabled=true;
			t=t<0?1000*60*15:1000*60*t;
			timerDOWNLOAD.Interval=t;
			/*载入定时器事件---------------------------------------*/
			//写入日志
			this.listBoxOUTPUT.Items.Add(log("sqlite",thisuser,"载入client软件","OK"));
			
			TaskTimer[] tt=new TaskTimer[10];
			treeView.Nodes.Clear();
			treeView.ImageList=imageListMAIL;
			
			//写入日志
			this.listBoxOUTPUT.Items.Add(log("sqlite",thisuser,"载入SQLITE数据库","OK"));
			
			try
			{
				SQLiteConnection conn = new SQLiteConnection();
				SQLiteConnectionStringBuilder connstr = new SQLiteConnectionStringBuilder();
	            connstr.DataSource = "my.db";
	            conn.ConnectionString = connstr.ToString();
	            conn.Open();	
			
	            //取得当前用户的全部目录,而且显示出来
	            string sql = "SELECT * FROM profile where UID='"+thisuser+"'";
	            SQLiteCommand cmd = new SQLiteCommand();
	            cmd.CommandText = sql;
	            cmd.Connection = conn;
	            SQLiteDataReader reader = cmd.ExecuteReader();
            
	            string username = "";
	            string password = "";
	            string serverip="";
	            string serverport="";
	            string serverssl="";
	            string pro="";
	            string time="";
	            string state="";
	            string nickname="";
	            while (reader.Read())
	                {
	                    username = reader.GetString(1);
	                    password = reader.GetString(2);
	                    serverip=reader.GetString(3);
	                    serverport=reader.GetString(4);
	                    serverssl=reader.GetString(5);
	                    pro=reader.GetString(6);
	                    time=reader.GetString(8);
	                    state=reader.GetString(11);
	                    nickname=reader.GetString(12);
	                    
	                    string dir;
	                    dir="data\\"+thisuser+"\\" +""+username;
	                    	
	                    TreeNode root = new TreeNode();
	                    if(string.Compare(nickname,"无")==0)
	                    {
	                    	root.Text=username;
	                    }
	                    else
	                    {
	                    	root.Text=username+"("+nickname+")";
	                    }
	                    	
	                    	
						if(pro=="IMAP")
						{
							root.ImageIndex=0;
							root.SelectedImageIndex=0;
						}
						else
						{
							root.ImageIndex=1;
							root.SelectedImageIndex=1;
						}
							
						if(Directory.Exists(dir))
						{
							DirectoryInfo[] list = new DirectoryInfo(@dir).GetDirectories();
							Array.Sort<DirectoryInfo>(list, new DirectoryLastTimeComparer());
							foreach(DirectoryInfo   d   in   list)//查找子目录     
							{  
								TreeNode son = new TreeNode();
								son.Text=d.ToString();
								son.SelectedImageIndex=2;
								son.ImageIndex=2;
								root.Nodes.Add(son);
							}
								
							//加入到树
							if(string.Compare(state,"0")==0)
							root.ForeColor=Color.Red;
								
							treeView.Nodes.Add(root);
						}
						else
						{
							
							Directory.CreateDirectory(dir);
							Directory.CreateDirectory(dir+"//收件箱");
							
							DirectoryInfo[] list = new DirectoryInfo(@dir).GetDirectories();
							Array.Sort<DirectoryInfo>(list, new DirectoryLastTimeComparer());
							foreach(DirectoryInfo   d   in   list)//查找子目录     
							{  
								TreeNode son = new TreeNode();
								son.Text=d.ToString();
								son.SelectedImageIndex=2;
								son.ImageIndex=2;
								root.Nodes.Add(son);
							}
								
							//加入到树
							if(string.Compare(state,"0")==0)
							root.ForeColor=Color.Red;
								
							treeView.Nodes.Add(root);
						}
						
					
						//写入日志
						this.listBoxOUTPUT.Items.Add(log("acount",thisuser,"载入账户"+username,"OK"));
						//有效邮箱++
						mail_able++;								 
	                }
	                connstr.Clear();
	                reader.Close();
	                conn.Close();
				}
				catch(Exception x)
				{
					//写入日志
					this.listBoxOUTPUT.Items.Add(log("sqlite\t",thisuser,"数据库载入错误  error:",x.Message));
					//删除出错账户
					//
					
				}
				
				//遍历全部目录
				DirectoryInfo folder = new DirectoryInfo(@Application.StartupPath+"\\");
  				GetAll(folder);

				this.labelGLOBAL.Text=this.labelGLOBAL.Text+" 总账户数:"+(mail_able+mail_unable).ToString();
				this.labelGLOBAL.Text=this.labelGLOBAL.Text+" 有效账户:"+mail_able.ToString()+" 无效账户:"+mail_unable.ToString();
				this.labelGLOBAL.Text=this.labelGLOBAL.Text+" 总邮件数:"+emlnum.ToString();
		}
		
		//左键点击事件
		void TreeViewNodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
		{
			treeView.SelectedNode=e.Node;
			if(e.Node.Parent!=null)
			{
				string[] title = this.treeView.SelectedNode.Parent.Text.Split(new char[] { '(' });
				//index=0 则代表是POP3
				string folder=title[0];
				//循环载入该目录中的全部文件
				  FileInfo[] fileInfo = new MyClass().GetFiles(@"data\\"+thisuser+"\\"+folder+"\\"+this.treeView.SelectedNode.Text);
				//清空列表
				listView.Items.Clear();
				int yishou=0;
		        foreach (FileInfo NextFile in fileInfo)  //遍历文件
		        {
		        	string str=NextFile.Name.ToString();
		        	str=str.Replace(".eml","");
		        	//BASE64解密
		        	cstring mystring=new cstring();
		        	string uncode=mystring.DECODE(str);
					string[] s = uncode.Split(new char[] { '#' });		
					try
					{
						yishou++;
						//定义一个列表
						ListViewItem currentItem = new ListViewItem();
	            		currentItem.ImageIndex = 0;
	            		currentItem.Text = s[0];
	            		currentItem.SubItems.Add(s[1]);
	            		currentItem.SubItems.Add(s[2]);
	            		currentItem.SubItems.Add(s[3]);
					    //加入到控件中
		                listView.Items.Add(currentItem);
					}
					catch(Exception x)
					{
						//写入日志
						this.listBoxOUTPUT.Items.Add(log("emlfile",thisuser,"载入已收文件格式出错 "+folder,x.Message));
					}
					
		       }//end foreach
		        this.labelSTATE.Text="新收0封";
		        this.labelYISHOU.Text="已收"+yishou.ToString()+"封";
			}
				
		}
			
		
		void 加入账户ToolStripMenuItemClick(object sender, EventArgs e)
		{
			FormSeting f=new FormSeting();
			f.thisuser=thisuser;
			if(f.ShowDialog()==DialogResult.OK)
			{
				//载入邮件目录目录
				string dir="data\\"+thisuser+"\\"+f.zhanghu;
				TreeNode root = new TreeNode();
				root.Text=f.zhanghu;
				if(f.xieyi=="IMAP")
				{
					root.ImageIndex=0;
					root.SelectedImageIndex=0;
				}
				else
				{
					root.ImageIndex=1;
					root.SelectedImageIndex=1;
				}
				
				DirectoryInfo   Dir=new   DirectoryInfo(dir);
				foreach(DirectoryInfo   d   in   Dir.GetDirectories())//查找子目录     
				{  
					TreeNode son = new TreeNode();
					son.Text=d.ToString();
					son.SelectedImageIndex=2;
					son.ImageIndex=2;
					root.Nodes.Add(son);
				}  
				treeView.Nodes.Add(root);
				
				//写入日志
				this.listBoxOUTPUT.Items.Add(log("add",thisuser,"添加账户成功"+f.zhanghu,"OK"));
			}
			
		}
		
		
		void 收邮件ToolStripMenuItemClick(object sender, EventArgs e)
		{	
			//空点击
			if(treeView.SelectedNode==null)return;
			//假设是子目录
			if(treeView.SelectedNode.Parent!=null)
			{
				if(treeView.SelectedNode.Parent.ForeColor==Color.Red)
				{
					return;
				}
			}
			//父节点
			if(treeView.SelectedNode.ForeColor==Color.Red)return;
			
			//运行收取邮件线程函数
			Thread oThread = new Thread(new ThreadStart(GET)); 
	  		oThread.Start();
			oThread.IsBackground=true;
			
			//写入日志
			this.listBoxOUTPUT.Items.Add(log("getmail",thisuser,"收取邮件","OK"));	
					
		}	
		//自己定义函数
		public string GetMail()
		{
			return PREmail;
		}
		//自己定义函数
		public string GetPro()
		{
			return PRPro;
		}
		//自己定义函数
		public void Setthisuser(string str)
		{
			thisuser=str;
		}
		//自己定义函数
		public string Getthisuser()
		{
			return thisuser;
		}
		void 自己定义收件ToolStripMenuItemClick(object sender, EventArgs e)
		{
			if(treeView.SelectedNode!=null && treeView.SelectedNode.Parent==null && treeView.SelectedNode.ForeColor!=Color.Red)
			{
				string[] title = this.treeView.SelectedNode.Text.Split(new char[] { '(' });
				//POP3协议
				if(treeView.SelectedNode.ImageIndex==1 || (treeView.SelectedNode.Parent!=null && treeView.SelectedNode.Parent.ImageIndex==1))
				{
					PRPro="POP3";
				}
				else
				{
					PRPro="IMAP";
				}
				FormRULE f=new FormRULE();
				f.usr=title[0];
				f.pro=PRPro;
				if(f.ShowDialog()==DialogResult.OK)
				{
					
				}
			}
			
		}
		
		//右键收取邮件线程代理
		delegate void DEGET();
		//右键收取邮件线程函数
		public void GET()
		{
				
				//连接SQLite数据库
				SQLiteConnection conn = new SQLiteConnection();
				SQLiteConnectionStringBuilder connstr = new SQLiteConnectionStringBuilder();
	            connstr.DataSource = "my.db";
	            conn.ConnectionString = connstr.ToString();
	            conn.Open();

	            string usr ="";
		        string pass ="";
		        string ip="";
		        string port="";
		        string ssl="";
		        string pro="";
		        string start="";
		        string end="";
		        string tongbu="";
		        string first="-1";
	            //假设点击的是子节点且是POP3协议   imageIndex==1
	            if (treeView.SelectedNode.ImageIndex==1 || (treeView.SelectedNode.Parent!=null && treeView.SelectedNode.Parent.ImageIndex==1))
				{
					if(treeView.SelectedNode.ImageIndex==1)
					{
						string[] title = this.treeView.SelectedNode.Text.Split(new char[] { '(' });
						//取得当前点击的父节点名称  点击的是父节点的收取邮件
						usr=title[0];
					}
					else if(treeView.SelectedNode.Parent.ImageIndex==1)
					{
						string[] title = this.treeView.SelectedNode.Parent.Text.Split(new char[] { '(' });
						//若点击的是儿子节点,则取父亲的节点名称
						usr=title[0];
					}
					listView.Items.Clear();
					string sql = "SELECT * FROM profile WHERE USERNAME='"+usr+"'"; 
					SQLiteCommand cmd = new SQLiteCommand();
		           	cmd.CommandText = sql;
		            cmd.Connection = conn;
		            SQLiteDataReader reader = cmd.ExecuteReader();
		            //取出数据
		            while (reader.Read())
		            {
		                  	usr = reader.GetString(1);
		                    pass = reader.GetString(2);
		                    ip=reader.GetString(3);
		                    port=reader.GetString(4);
		                    ssl=reader.GetString(5);
		                    pro=reader.GetString(6);
		                    start=reader.GetString(7);
		                    end=reader.GetString(8);
		                    tongbu=reader.GetString(10);
		                    first=reader.GetString(14);
		            }
		            reader.Close();
		            this.Cursor = Cursors.WaitCursor;
		            this.labelTONGBU.Text="上次同步时间:"+tongbu;
		            //写入日志
					this.listBoxOUTPUT.Items.Add(log("pop3",thisuser,"開始收取POP3邮件 "+usr,"OK"));
					//推断用代理收取
					//在主函数中激活代理
					if(File.Exists("data\\"+thisuser+"\\"+usr+"\\server.txt"))
					{
						//打开读取
						string[] mapi;
						StreamReader sr = new StreamReader("data\\"+thisuser+"\\"+usr+"\\server.txt",Encoding.Default);
						string map=sr.ReadLine();
						sr.Close();
						mapi= map.Split(new char[] { ' ' });
						Random r=new Random();
						
						int localport=80+r.Next(0,1000);
						System.Diagnostics.Process.Start(@"proxy.exe",localport.ToString()+" "+mapi[0]+" "+mapi[1]+" "+ip+" "+port+" "+mapi[2]+" "+mapi[3]);
						ip="127.0.0.1";
						port=localport.ToString();
						ReceiveMail(port,ssl,pro,ip,usr,Decode(pass,"itbuluoge"),start,end,1,first);
					}
					else
					{
						ReceiveMail(port,ssl,pro,ip,usr,Decode(pass,"itbuluoge"),start,end,1,first);
					}
		            
		            this.labelSTATE.Text="新收"+this.listView.Items.Count.ToString()+"封";
		            this.Cursor = Cursors.Default;
		            //写入日志
					this.listBoxOUTPUT.Items.Add(log("pop3",thisuser,"收取POP3邮件完毕 "+usr,"OK"));
		            
				}
				//假设点击的是子节点且是IMAP协议   imageIndex==0	
				else if(treeView.SelectedNode.ImageIndex==0 || treeView.SelectedNode.Parent.ImageIndex==0)
				{ 
					//线程存在
					threadstate=1;
					global_type=1;
					string boxname="";
					if(treeView.SelectedNode.ImageIndex==0)
					{
						//取得当前点击的父节点名称  点击的是父节点的收取邮件
	            		usr=treeView.SelectedNode.Text.ToString();
	            		boxname="INBOX";;
					}
					if(treeView.SelectedNode.Parent!=null && treeView.SelectedNode.Parent.ImageIndex==0)
					{
						//若点击的是儿子节点,则取父亲的节点名称
						usr=treeView.SelectedNode.Parent.Text.ToString();
						boxname=treeView.SelectedNode.Text.ToString();
					}
		            //到数据库中查询出该节点所属信息
		            string sql = "SELECT * FROM profile where USERNAME='"+usr+"'";           
		            SQLiteCommand cmd = new SQLiteCommand();
		            cmd.CommandText = sql;
		            cmd.Connection = conn;
		            SQLiteDataReader reader = cmd.ExecuteReader();
            
		            while (reader.Read())
		                {
		                    usr = reader.GetString(1);
		                    pass = reader.GetString(2);
		                    ip=reader.GetString(3);
		                    port=reader.GetString(4);
		                    ssl=reader.GetString(5);
		                    pro=reader.GetString(6);
		                    imap_start=reader.GetString(7);
		                    imap_end=reader.GetString(8);
		                    tongbu=reader.GetString(10);
		                    first=reader.GetString(14);
		                    imapfirst=int.Parse(first);
		                }
		            reader.Close();
		            this.labelTONGBU.Text="上次同步时间:"+tongbu;
		            try
		            {
		            	//在主函数中激活代理
						if(File.Exists("data\\"+thisuser+"\\"+usr+"\\server.txt"))
						{
							//打开读取
							string[] mapi;
							StreamReader sr = new StreamReader("data\\"+thisuser+"\\"+usr+"\\server.txt",Encoding.Default);
							string map=sr.ReadLine();
							sr.Close();
							mapi= map.Split(new char[] { ' ' });
							Random r=new Random();
							
							int localport=80+r.Next(0,1000);
							System.Diagnostics.Process.Start(@"proxy.exe",localport.ToString()+" "+mapi[0]+" "+mapi[1]+" "+ip+" "+port+" "+mapi[2]+" "+mapi[3]);
							ip="127.0.0.1";
							port=localport.ToString();
						}
				            //開始建立
							IMAP_Client imap = new IMAP_Client();
							imap.Logger = new Logger();
							imap.Connect(ip,int.Parse(port),(ssl=="SSL"));
							imap.Login(usr,Decode(pass,"itbuluoge"));
							global_user=usr;
							folder=boxname;					
							m_pImap=imap;
								
							listView.Items.Clear();
							 this.Cursor = Cursors.WaitCursor;
							try{
				                m_pImap.SelectFolder(boxname);
				                string total="";
				               if(imapfirst>0)
				               {
				                	total="1:"+imapfirst.ToString();
				                }
				                else
				                {
				                	total="1:*";
				                }
				                //假设是雅虎
				                if(ip=="apple.imap.mail.yahoo.com")
				                {
				                	//開始循环取邮件数据                
					                m_pImap.Fetch(
					                    true,
					                    IMAP_t_SeqSet.Parse("1:*"),
					                    new IMAP_t_Fetch_i[]{
					                      	new IMAP_t_Fetch_i_Envelope(),
					                        new IMAP_t_Fetch_i_Flags(),
					                        new IMAP_t_Fetch_i_InternalDate(),
					                        new IMAP_t_Fetch_i_Rfc822Size(),
					                        new IMAP_t_Fetch_i_Uid(),
					                        //new IMAP_t_Fetch_i_Rfc822()
					                    },
					                    this.m_pImap_Fetch_MessageItems_UntaggedResponseyahoo
					                );
				                	
				                	//写入邮件处
				                	if (listView.Items.Count > 0)
            						{
				                		for (int i=0;i<listView.Items.Count;i++)
											{
				                				LoadMessage((long)listView.Items[i].Tag);
											}

            						}
				                	//
				                }
				                else
				                {
				                	//開始循环取邮件数据                
					                m_pImap.Fetch(
					                    true,
					                    IMAP_t_SeqSet.Parse("1:*"),
					                    new IMAP_t_Fetch_i[]{
					                      	new IMAP_t_Fetch_i_Envelope(),
					                        new IMAP_t_Fetch_i_Flags(),
					                        new IMAP_t_Fetch_i_InternalDate(),
					                        new IMAP_t_Fetch_i_Rfc822Size(),
					                        new IMAP_t_Fetch_i_Uid(),
					                        new IMAP_t_Fetch_i_Rfc822()
					                    },
					                    this.m_pImap_Fetch_MessageItems_UntaggedResponse
					                );
				                }
								
				            }
				            catch(Exception x)
				            {
								//MessageBox.Show(x.ToString());
				               // MessageBox.Show(this,"Error: " + x.Message,"Error:",MessageBoxButtons.OK,MessageBoxIcon.Error);
				            }
							this.Cursor = Cursors.Default;
		            }
		            catch(Exception x)
				         {
							//写入日志
							//无法连接,加入到失败栏目
							string sql_w = "UPDATE profile SET STATE='0' WHERE USERNAME='"+usr+"'";
							//插入到数据库
							SQLquery(sql_w);
							//加入到错误列表
							if(this.treeView.SelectedNode.Parent==null)
			                this.treeView.SelectedNode.ForeColor=Color.Red;
							else
							this.treeView.SelectedNode.Parent.ForeColor=Color.Red;						
							//写入日志
							this.listBoxOUTPUT.Items.Add(log("imap\t",thisuser,"连接IMAP出错",x.Message));
				        }
		           
				}
				//线程结束
				threadstate=0;
				this.labelSTATE.Text="新收"+this.listView.Items.Count.ToString()+"封";
				conn.Close();
				//更改本次同步时间
		        string nowtime=System.DateTime.Now.ToString("yyyy年MM月dd日 HH时mm分");
		        string sql1="update profile set TIME='"+nowtime+"' where USERNAME='"+usr+"'";
		        conn.Open();
		        SQLiteCommand cmd1 = new SQLiteCommand();
		        cmd1.CommandText = sql1;
		        cmd1.Connection = conn;
		        cmd1.ExecuteNonQuery();;
		        conn.Close();
		        
		        CloseProcess("test.exe");
		}
		//调用读取邮件函数
		private void LoadMessage(long uid)
        {     
            this.Cursor = Cursors.WaitCursor;
            try{
                // Start fetching.
                m_pImap.Fetch(
                    true,
                    IMAP_t_SeqSet.Parse(uid.ToString()),
                    new IMAP_t_Fetch_i[]{
                        new IMAP_t_Fetch_i_Rfc822()
                    },
                    this.m_pImap_Fetch_Message_UntaggedResponse
                );
            }
            catch(Exception x){
                MessageBox.Show(this,"Error: " + x.ToString(),"Error:",MessageBoxButtons.OK,MessageBoxIcon.Error);
            }
            this.Cursor = Cursors.Default;
        }
		//邮件读取回调函数
		 private void m_pImap_Fetch_Message_UntaggedResponse(object sender,EventArgs<IMAP_r_u> e)
        {
            /* NOTE: All IMAP untagged responses may be raised from thread pool thread,
                so all UI operations must use Invoke.
             
               There may be other untagged responses than FETCH, because IMAP server
               may send any untagged response to any command.
            */

            try{
                if(e.Value is IMAP_r_u_Fetch){
                    IMAP_r_u_Fetch fetchResp = (IMAP_r_u_Fetch)e.Value;
                
                    this.BeginInvoke(new MethodInvoker(delegate(){
                        try{
                            fetchResp.Rfc822.Stream.Position = 0;
                            Mail_Message mime = Mail_Message.ParseFromStream(fetchResp.Rfc822.Stream);
                            fetchResp.Rfc822.Stream.Dispose();

                            //m_pTabPageMail_MessagesToolbar.Items["save"].Enabled = true;
                            //m_pTabPageMail_MessagesToolbar.Items["delete"].Enabled = true;
                                    
                            //m_pTabPageMail_MessageAttachments.Tag = mime;
                            foreach(MIME_Entity entity in mime.Attachments){
                                //ListViewItem item = new ListViewItem();
                                if(entity.ContentDisposition != null && entity.ContentDisposition.Param_FileName != null){
                                    //item.Text = entity.ContentDisposition.Param_FileName;
                                }
                                else{
                                   // item.Text = "untitled";
                                }
                                //item.ImageIndex = 0;
                               // item.Tag = entity;
                                //m_pTabPageMail_MessageAttachments.Items.Add(item);
                            }

                            if(mime.BodyText != null){
                               // m_pTabPageMail_MessageText.Text = mime.BodyText;
                            }
                            
                            try
                            {
                            	//写入eml
	                            str stringhandle=new str();
								string title=mime.From.ToString()+"#"+stringhandle.strlen(mime.Subject.ToString(),20)+"#"+mime.Date.ToString("yyyy年MM月dd日 HH时mm分")+"#"+(mime.BodyText.Length / (decimal)1000).ToString("f2") + " kb#";
		                        title=FilterSpecial(title);
		                        cstring mystring=new cstring();
		                        title=mystring.ENCODE(title);
								title+=".eml";	
								//写入eml文件
	                        	string filepro=Application.StartupPath+"\\data\\"+thisuser+"\\"+global_user+"\\"+folder+"\\"+title;
	                            FileStream fs = new FileStream(filepro, FileMode.Create);//文件名称和路径
			                    StreamWriter sw = new StreamWriter(fs);
						        //開始写入
						        sw.Write(mime);					        
						        //清空缓冲区
						        sw.Flush();
						        //关闭流
						        sw.Close();
						        fs.Close();
                            }
                            catch(Exception x)
                            {
                            	
                            }
                            
                        }
                        catch(Exception x){
                            MessageBox.Show("Error: " + x.ToString(),"Error:",MessageBoxButtons.OK,MessageBoxIcon.Error);
                        }
                    }));
                }
            }
            catch(Exception x){
                MessageBox.Show("Error: " + x.ToString(),"Error:",MessageBoxButtons.OK,MessageBoxIcon.Error);
            }
        }
		//定时器事件
		public void theout(object source, EventArgs e) 
		{
			TaskTimer ttt = (TaskTimer)source;
			//MessageBox.Show(zhanghu[ttt.ID].usr+" "+zhanghu[ttt.ID].time.ToString());
			//在这里运行自己主动收信时间
//			if(zhanghu[ttt.ID].pro=="POP3")
//			{
//				ReceiveMail(zhanghu[ttt.ID].port.ToString(),zhanghu[ttt.ID].ssl,zhanghu[ttt.ID].pro,zhanghu[ttt.ID].ip,zhanghu[ttt.ID].usr,zhanghu[ttt.ID].pass);
//			}
			
		}
		
		//自己主动下载邮件事件
		void TimerDOWNLOADTick(object sender, EventArgs e)
		{
			/*
			//运行收取邮件线程函数
			Thread oThread = new Thread(new ThreadStart(AUTO)); 
  			oThread.Start();
			oThread.IsBackground=true;
			*/  
		}
		//全部收件
		public void ALL()
		{
			//进程開始
			threadstate=1;
			//写入日志
			this.listBoxOUTPUT.Items.Add(log("all",thisuser,"開始全部收信","OK"));
			//鼠标进入等待
			this.Cursor = Cursors.WaitCursor;
			try
			{
				SQLiteConnection conn = new SQLiteConnection();
				SQLiteConnectionStringBuilder connstr = new SQLiteConnectionStringBuilder();
		        connstr.DataSource = "my.db";
		        conn.ConnectionString = connstr.ToString();
		        conn.Open();
		        string sql = "SELECT * FROM profile where UID='"+thisuser+"' AND state='1'";
		        SQLiteCommand cmd = new SQLiteCommand();
		    	cmd.CommandText = sql;
		    	cmd.Connection = conn;
		    	SQLiteDataReader reader = cmd.ExecuteReader();
		    	
		    	//取出数据
			    string usr,pass,ip,port,ssl,pro,start,end,first="-1";
			    while (reader.Read())
		        {
			    	usr = reader.GetString(1);
		            pass = reader.GetString(2);
		            ip=reader.GetString(3);
		            port=reader.GetString(4);
		            ssl=reader.GetString(5);
		            pro=reader.GetString(6);
		            start=reader.GetString(7);
		            end=reader.GetString(8);
		            first=reader.GetString(14);
		            
		            global_user=usr;
		            //POP3处理下载邮件
		            if(string.Compare(pro,"POP3")==0)
		            {
						ReceiveMail(port,ssl,pro,ip,usr,Decode(pass,"itbuluoge"),start,end,0,first);
					}
		            else if(string.Compare(pro,"IMAP")==0)
		            {
		            	//ReceiveIMAP(port,ssl,pro,ip,usr,Decode(pass,"itbuluoge"),start,end,0,first,"INBOX");
						//開始建立
						try{
								IMAP_Client imap = new IMAP_Client();
								imap.Logger = new Logger();
								imap.Connect(ip,int.Parse(port),(ssl=="SSL"));
								imap.Login(usr,Decode(pass,"itbuluoge"));
								global_user=usr;
								global_type=0;
								folder="INBOX";					
								m_pImap=imap;
							
				                m_pImap.SelectFolder(folder);
				                string total="";
				                if(int.Parse(first)>0)
				                {
				                	total="1:"+first;
				                }
				                else
				                {
				                	total="1:*";
				                }
								//開始循环取邮件数据                
				                m_pImap.Fetch(
				                    false,
				                    IMAP_t_SeqSet.Parse(total),
				                    new IMAP_t_Fetch_i[]{
				                      	new IMAP_t_Fetch_i_Envelope(),
				                        new IMAP_t_Fetch_i_Flags(),
				                        new IMAP_t_Fetch_i_InternalDate(),
				                        new IMAP_t_Fetch_i_Rfc822Size(),
				                        new IMAP_t_Fetch_i_Uid(),
				                         new IMAP_t_Fetch_i_Rfc822()
				                    },
				                    this.m_pImap_Fetch_MessageItems_UntaggedResponse
				                );
				            }
							 catch(Exception x)
							 {
							 	//写入日志
								this.listBoxOUTPUT.Items.Add(log("all",thisuser,"连接IMAP出错",x.Message));
							 }
							 
							
		           
		            }
			    }
			    
			   
			}
			catch(Exception x)
			{
				//写入日志
				this.listBoxOUTPUT.Items.Add(log("all",thisuser,"数据库错误",x.Message));
			}
			 //写入日志
				this.listBoxOUTPUT.Items.Add(log("all",thisuser,"全部收信结束","OK"));

			//鼠标恢复
			this.Cursor = Cursors.Default;
			//进程结束
			threadstate=0;
		}
		//运行收取邮件线程函数
		public void AUTO()
		{
			//进程開始
			threadstate=1;
			//写入日志
			this.listBoxOUTPUT.Items.Add(log("auto",thisuser,"開始自己主动收信","OK"));
			//连接SQLite数据库
			SQLiteConnection conn = new SQLiteConnection();
			SQLiteConnectionStringBuilder connstr = new SQLiteConnectionStringBuilder();
	        connstr.DataSource = "my.db";
	        conn.ConnectionString = connstr.ToString();
	        conn.Open();
            
            this.Cursor = Cursors.WaitCursor;
            string sql = "SELECT * FROM profile"; 
			SQLiteCommand cmd = new SQLiteCommand();
		    cmd.CommandText = sql;
		    cmd.Connection = conn;
		    SQLiteDataReader reader = cmd.ExecuteReader();
		    
		    //取出数据
		    string usr ="";
		    string pass ="";
		    string ip="";
		    string port="";
		    string ssl="";
		    string pro="";
		    string start="";
		    string end="";
		    string each_auto="";
		    string first="-1";
		    while (reader.Read())
		          {
		                  	usr = reader.GetString(1);
		                    pass = reader.GetString(2);
		                    ip=reader.GetString(3);
		                    port=reader.GetString(4);
		                    ssl=reader.GetString(5);
		                    pro=reader.GetString(6);
		                    start=reader.GetString(7);
		                    end=reader.GetString(8);
		                    each_auto=reader.GetString(13);

		    				//POP3处理下载邮件
						    if(pro=="POP3" && string.Compare(each_auto,auto)==0)
						    {
						    	ReceiveMail(port,ssl,pro,ip,usr,Decode(pass,"itbuluoge"),start,end,0,first);
						    }
						    if(pro=="IMAP" && string.Compare(each_auto,auto)==0)
						    {
						    	global_type=0;
						    	//開始建立
								IMAP_Client imap = new IMAP_Client();
								imap.Logger = new Logger();
								imap.Connect(ip,int.Parse(port),(ssl=="SSL"));
								imap.Login(usr,Decode(pass,"itbuluoge"));
								global_user=usr;
								folder="INBOX";					
								m_pImap=imap;
						
								try{
		                			m_pImap.SelectFolder("INBOX");
		                
									//開始循环取邮件数据                
		                			m_pImap.Fetch(
							                    false,
							                    IMAP_t_SeqSet.Parse("1:*"),
							                    new IMAP_t_Fetch_i[]{
						                      	new IMAP_t_Fetch_i_Envelope(),
						                        new IMAP_t_Fetch_i_Flags(),
						                        new IMAP_t_Fetch_i_InternalDate(),
						                        new IMAP_t_Fetch_i_Rfc822Size(),
						                        new IMAP_t_Fetch_i_Uid(),
						                        new IMAP_t_Fetch_i_Rfc822()
		                    },
		                    this.m_pImap_Fetch_MessageItems_UntaggedResponse
		                );
		            }
		            catch(Exception x)
		            {
						//MessageBox.Show(x.ToString());
		               // MessageBox.Show(this,"Error: " + x.Message,"Error:",MessageBoxButtons.OK,MessageBoxIcon.Error);
		            }

					 }
		    
		         }
		            
		   this.Cursor = Cursors.Default;
		   //写入日志
			this.listBoxOUTPUT.Items.Add(log("automail\t",thisuser,"自己主动收信完毕","OK"));
		   //进程结束
			threadstate=0;
            
		}		
		
		void 删除账户ToolStripMenuItemClick(object sender, EventArgs e)
		{
			
			if(treeView.SelectedNode!=null && treeView.SelectedNode.Parent==null)
			{
				if (MessageBox.Show("将删除全部邮件信息?", "提示", MessageBoxButtons.YesNo) == DialogResult.Yes)
			  	{
			  		//删除
			  		try
					{
						string[] title = this.treeView.SelectedNode.Text.Split(new char[] { '(' });
						SQLiteConnection conn = new SQLiteConnection();
						SQLiteConnectionStringBuilder connstr = new SQLiteConnectionStringBuilder();
				        connstr.DataSource = "my.db";
				        conn.ConnectionString = connstr.ToString();
				        conn.Open();
				        //运行SQL语句  
				        string user="";
						string name="";	        
						user=title[0];
				        if(treeView.SelectedNode.ImageIndex==1)
				         	name="POP3";
				        else
				         	name="IMAP";
						string sql = "DELETE  FROM profile where USERNAME='"+user+"' AND UID='"+thisuser+"'";   			
				       	SQLiteCommand cmd = new SQLiteCommand();
				       	cmd.CommandText = sql;
				       	cmd.Connection = conn;
				       	cmd.ExecuteNonQuery();
				       	treeView.Nodes.Remove(treeView.SelectedNode);
				       	//关闭全部连接         
				       	connstr.Clear();
				       	conn.Close();
	
				       	//删除目录
				       	System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(@"data\\"+thisuser+"\\"+user);
			            di.Delete(true);
			            
			            //写入日志
						this.listBoxOUTPUT.Items.Add(log("dele",thisuser,"删除账户成功"+user,"OK"));
			         
					}
					catch(Exception x)
					{
						//写入日志
						this.listBoxOUTPUT.Items.Add(log("dele",thisuser,"数据库删除错误 ",x.Message));
					}
			  	}
				
				
			}
			
	   }
			
		//文件名称过滤函数
			public string FilterSpecial(string strHtml)
			{
				if(string.Empty == strHtml)
				{
					return strHtml;
				}
				string[] aryReg = {"\"", "'", "'delete", "?", "<", ">","%", "\"\"",
					",","_", ";",":","\\",
					"||", "[", "]", "&", "/", "-", 
					"=", " ", "、", ";", "。", "”", "“", 
					"|", " ", "''" ,"【","】"};
				for (int i = 0; i < aryReg.Length; i++)
				{
				     strHtml = strHtml.Replace(aryReg[i], string.Empty);
				}
     			return strHtml;
			}
		//返回当前日期函数
		public string log(string id,string usr,string action,string state)
		{
			//创建或打开系统日志
		    string systemlog=@"log\\system.log";
		    try
		    {
		    	FileStream fs=new FileStream(systemlog, FileMode.Append);
			    StreamWriter sw = new StreamWriter(fs,Encoding.GetEncoding("gb2312"));
				//開始写入
				sw.Write(id+"\t"+System.DateTime.Now.ToString("yyyy年MM月dd日 HH时mm分")+" "+usr+"\t"+action+"\t\t\t\t"+state+"\r\n");
				//清空缓冲区
				sw.Flush();
				//关闭流
				sw.Close();
				fs.Close();
		    }
		    catch(Exception e)
		    {
		    	;
		    }
			
			return id+"\t"+System.DateTime.Now.ToString("yyyy年MM月dd日 HH时mm分")+" "+usr+"\t"+action+"\t\t\t\t"+state;
		
		}
		//写入用户登陆
		public void write_userlog(string user,string action)
		{
			try
			{
				//创建或打开用户登陆日志
			    string userlog=@"log\\"+user+".log";
				FileStream fs=new FileStream(userlog, FileMode.Append);
			    StreamWriter sw = new StreamWriter(fs,Encoding.GetEncoding("gb2312"));
				//開始写入
				sw.Write(log("logon\t",user,action,"OK")+"\r\n");
				//清空缓冲区
				sw.Flush();
				//关闭流
				sw.Close();
				fs.Close();
			}
			catch(Exception e)
		    {
		    	;
		    }
			
			
			
		}
		
		void GetAll(DirectoryInfo dir)//搜索目录中的文件
        {
            FileInfo[] allFile = dir.GetFiles();
            foreach (FileInfo fi in allFile)
            {
            	if(fi.Name.Contains(".eml"))emlnum++;

            }

            DirectoryInfo[] allDir= dir.GetDirectories();
            foreach (DirectoryInfo d in allDir)
            {
                GetAll(d);
            }
        }
		
		void MainFormFormClosing(object sender, FormClosingEventArgs e)
		{
			//线程存在
			if(threadstate==1)
			{
				e.Cancel =true ;
	            this.WindowState = FormWindowState.Minimized;
	            this.Visible = false;
			}
			else
			{
				write_userlog(thisuser,"用户退出");
			}
			
			
		}
		private void notifyIcon_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                this.Visible = true;
                this.WindowState = FormWindowState.Normal;
                return;
            }   
        }
		private void toolStripMenuItemClose_Click(object sender, EventArgs e)
        {
           Environment.Exit(0);
        }
		
		void 打开ToolStripMenuItemClick(object sender, EventArgs e)
		{
			 this.Visible = true;
             this.WindowState = FormWindowState.Normal;
             return;
		}
		
		void 退出ToolStripMenuItemClick(object sender, EventArgs e)
		{
			  if (MessageBox.Show("您确定要退出邮件client吗?", "确认退出", MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.OK)
            {
			  	write_userlog(thisuser,"用户退出");
                this.notifyIconSMALL.Visible = false;
                this.Close();
                this.Dispose();
                Application.Exit();			
			}
		}
		
		void 同步设置ToolStripMenuItemClick(object sender, EventArgs e)
		{
			FormGLOBAL f=new FormGLOBAL();
			if(f.ShowDialog()==DialogResult.OK)
			{
				//MessageBox.Show("ok");
			}		
		}
		
		void 登陆日志ToolStripMenuItemClick(object sender, EventArgs e)
		{
			//System.Diagnostics.Process.Start(thisuser+".log");
			FormSHOWLOG f=new FormSHOWLOG();
			f.logfile="log\\"+thisuser+".log";
			f.Text="登陆日志";
			f.ShowDialog();
		}
		
		void 用户加入ToolStripMenuItemClick(object sender, EventArgs e)
		{
			FormUSER f=new FormUSER();
			if(f.ShowDialog()==DialogResult.OK)
			{
				//
			}	
		}
		
		void 账户属性ToolStripMenuItemClick(object sender, EventArgs e)
		{
			if(treeView.SelectedNode!=null && treeView.SelectedNode.Parent==null)
			{
				
				string[] title = this.treeView.SelectedNode.Text.Split(new char[] { '(' });
				PREmail=title[0];
				//POP3协议
				if(treeView.SelectedNode.ImageIndex==1 || (treeView.SelectedNode.Parent!=null && treeView.SelectedNode.Parent.ImageIndex==1))
				{
					PRPro="POP3";
				}
				else
				{
					PRPro="IMAP";
				}
				FormZHANGHU f=new FormZHANGHU();
				if(f.ShowDialog()==DialogResult.OK)
				{
					//更新状态
					treeView.SelectedNode.ForeColor=Color.Black;
					string sql = "UPDATE profile SET STATE='1' WHERE USERNAME='"+title[0]+"'";
					//插入到数据库
					SQLquery(sql);
				}	
			}
			
		}
		
		void 系统日志ToolStripMenuItemClick(object sender, EventArgs e)
		{
			FormSHOWLOG f=new FormSHOWLOG();
			f.logfile="log\\system.log";
			f.Text="系统日志";
			f.ShowDialog();			
		}
		
		void 加入代理ToolStripMenuItemClick(object sender, EventArgs e)
		{
			FormADDproxy f=new FormADDproxy();
			f.ShowDialog();	
			//MessageBox.Show("该功能在下个版本号中支持!");
		}
		
		void 帮助ToolStripMenuItemClick(object sender, EventArgs e)
		{
			FormHELP f=new FormHELP();
			f.ShowDialog();		
		}
		
		void 代理设置ToolStripMenuItem1Click(object sender, EventArgs e)
		{
			if(treeView.SelectedNode!=null && treeView.SelectedNode.Parent==null && treeView.SelectedNode.ForeColor!=Color.Red)
			{
				string[] title = this.treeView.SelectedNode.Text.Split(new char[] { '(' });
				//POP3协议
				if(treeView.SelectedNode.ImageIndex==1 || (treeView.SelectedNode.Parent!=null && treeView.SelectedNode.Parent.ImageIndex==1))
				{
					PRPro="POP3";
				}
				else
				{
					PRPro="IMAP";
				}
				
				FormPROXY f=new FormPROXY();
				f.thisuser=thisuser;
				f.usr=title[0];
				f.pro=PRPro;
				f.ShowDialog();
				
			}
			
		}
		public void CloseProcess(string ProcessName)
        {
            Process[] p = Process.GetProcessesByName(ProcessName);
            if (p.Length > 0)
            {
                try
                {
                    p[0].Kill();
                }
                catch
                {
                    ;  
                }
            }
        }
		
		void 备注ToolStripMenuItemClick(object sender, EventArgs e)
		{
			if(treeView.SelectedNode!=null && treeView.SelectedNode.Parent==null)
			{
				string[] title = this.treeView.SelectedNode.Text.Split(new char[] { '(' });
				//POP3协议
				if(treeView.SelectedNode.ImageIndex==1 || (treeView.SelectedNode.Parent!=null && treeView.SelectedNode.Parent.ImageIndex==1))
				{
					PRPro="POP3";
				}
				else
				{
					PRPro="IMAP";
				}
				FormMEMO f=new FormMEMO();
				f.usr=title[0];
				f.pro=PRPro;
				if(f.ShowDialog()==DialogResult.OK)
				{
					
					if(string.Compare(f.memo,"")!=0)
					{
						this.treeView.SelectedNode.Text=title[0]+"(";
						this.treeView.SelectedNode.Text+=f.memo;
						this.treeView.SelectedNode.Text+=")";
					}
					else
					{
						this.treeView.SelectedNode.Text=title[0];
					}
					
				}	
			
			}
		}
		
		//15分钟自己主动收信
		void Timer15Tick(object sender, EventArgs e)
		{
			//运行收取邮件线程函数
			auto="15";
			Thread oThread = new Thread(new ThreadStart(AUTO)); 
  			oThread.Start();
			oThread.IsBackground=true;  			
		}
		//30分钟自己主动收信
		void Timer30Tick(object sender, EventArgs e)
		{
			//运行收取邮件线程函数
			auto="30";
			Thread oThread = new Thread(new ThreadStart(AUTO)); 
  			oThread.Start();
			oThread.IsBackground=true;  			
		}
		//60分钟自己主动收信
		void Timer60Tick(object sender, EventArgs e)
		{
			//运行收取邮件线程函数
			auto="60";
			Thread oThread = new Thread(new ThreadStart(AUTO)); 
  			oThread.Start();
			oThread.IsBackground=true;  		
		}
		
		Thread alloThread;
		void 全部收件ToolStripMenuItemClick(object sender, EventArgs e)
		{
			alloThread = new Thread(new ThreadStart(ALL)); 
  			alloThread.Start();
			alloThread.IsBackground=true; 	
		}
		
		void 全部停止ToolStripMenuItemClick(object sender, EventArgs e)
		{
			alloThread.Abort();
			this.Cursor = Cursors.Default;
		}
		
		void MainFormKeyDown(object sender, KeyEventArgs e)
		{
			   if (e.Alt && e.KeyCode == Keys.A)
            	{
			   		this.Hide();
            	}
		}
		
		void MainFormFormClosed(object sender, FormClosedEventArgs e)
		{
			 m_hook.SetHook(false);	
		}
		
		void 删除账户ToolStripMenuItem1Click(object sender, EventArgs e)
		{
			try
				{
					string[] title = this.treeView.SelectedNode.Text.Split(new char[] { '(' });
					SQLiteConnection conn = new SQLiteConnection();
					SQLiteConnectionStringBuilder connstr = new SQLiteConnectionStringBuilder();
			        connstr.DataSource = "my.db";
			        conn.ConnectionString = connstr.ToString();
			        conn.Open();
			        //运行SQL语句  
			        string user="";
					string name="";	        
					user=title[0];
			        if(treeView.SelectedNode.ImageIndex==1)
			         	name="POP3";
			        else
			         	name="IMAP";
					string sql = "DELETE  FROM profile where USERNAME='"+user+"'AND PRO='"+name+"'";   			
			       	SQLiteCommand cmd = new SQLiteCommand();
			       	cmd.CommandText = sql;
			       	cmd.Connection = conn;
			       	cmd.ExecuteNonQuery();
			       	treeView.Nodes.Remove(treeView.SelectedNode);
			       	//关闭全部连接         
			       	connstr.Clear();
			       	conn.Close();
			       	
			       	//删除目录
			       	System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(@user+"#"+name);
		            di.Delete(true);
		            
		            //写入日志
					this.listBoxOUTPUT.Items.Add(log("dele",thisuser,"删除账户成功"+user,"OK"));
		         
				}
				catch(Exception x)
				{
					//写入日志
					this.listBoxOUTPUT.Items.Add(log("dele",thisuser,"数据库删除错误 ",x.Message));
				}			
		}
		
		void 代理管理ToolStripMenuItemClick(object sender, EventArgs e)
		{
			FormADMINproxy f=new FormADMINproxy();
			if(f.ShowDialog()==DialogResult.OK)
			{
				//
			}				
		}
	}
	
	public class TaskTimer : System.Windows.Forms.Timer
 {
  #region <变量>
  /// <summary>
  /// 定时器id
  /// </summary>
  private int id;
  /// <summary>
  /// 定时器參数
  /// </summary>
  private  string param ;
  public static int num;
  #endregion

  #region <属性>
  /// <summary>
  /// 定时器id属性
  /// </summary>
  public int ID
  {
   set{id = value;}
   get{return id;}
  }
  /// <summary>
  /// 定时器參数属性
  /// </summary>
  public string Param 
  {
   set{param = value;}
   get{return param;}
  }
  
  #endregion
  ///<summary>
  /// 构造函数
  /// </summary>
  public TaskTimer() : base ()
  {

  }
  
   
	}
	
	//LISTVIEW新类 防止闪动
	class ListViewNF : System.Windows.Forms.ListView
    {
        public ListViewNF()
        {
            // 开启双缓冲
            this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);

            // Enable the OnNotifyMessage event so we get a chance to filter out 
            // Windows messages before they get to the form's WndProc
            this.SetStyle(ControlStyles.EnableNotifyMessage, true);
        }

        protected override void OnNotifyMessage(Message m)
        {
            //Filter out the WM_ERASEBKGND message
            if (m.Msg != 0x14)
            {
                base.OnNotifyMessage(m);
            }

        }


    }
	
	//文件名称排序类
	public class FileComparer : IComparer
        {
            int IComparer.Compare(Object o1, Object o2)
            {
                FileInfo fi1 = o1 as FileInfo;
                FileInfo fi2 = o2 as FileInfo;
                return fi1.CreationTime.CompareTo(fi2.CreationTime);
            }
        }
	
	//目录排名类
	//目录中按时间排序最新的文件读取
    public class DirectoryLastTimeComparer : IComparer<DirectoryInfo>
    {
        #region IComparer<DirectoryInfo> 成员

        public int Compare(DirectoryInfo x, DirectoryInfo y)
        {
            return x.LastWriteTime.CompareTo(y.LastWriteTime);

        }

        #endregion
    }

    //目录中按时间排序最新的文件读取
    public class FIleLastTimeComparer : IComparer<FileInfo>
    {
        #region IComparer<FileInfo> 成员

        public int Compare(FileInfo x, FileInfo y)
        {
            return y.LastWriteTime.CompareTo(x.LastWriteTime);
        }

        #endregion
    } 

        public class MyClass
        {
            public FileInfo[] GetFiles(string path)
            {
                DirectoryInfo di = new DirectoryInfo(path);
                FileInfo[] files = di.GetFiles();
                FileComparer fc = new FileComparer();
                Array.Sort(files, fc);
                return files;
            }
        } 
        
        class ActiveHook
    {
        /*****************************************
         * Created By: Jickie 阿文
         * Created: 2009/10/29
         * **************************************/

        public const int WM_KEYDOWN = 0x0100;
        public const int WM_KEYUP = 0x0101;
        public const int WM_CHAR = 0x0102;

        public const int SWP_NOSIZE = 0x0001;
        public const int SWP_NOMOVE = 0x0002;
        public const int SWP_NOZORDER = 0x0004;
        public const int SWP_NOREDRAW = 0x0008;
        public const int SWP_NOACTIVATE = 0x0010;
        public const int SWP_FRAMECHANGED = 0x0020;  /* The frame changed: send WM_NCCALCSIZE */
        public const int SWP_SHOWWINDOW = 0x0040;
        public const int SWP_HIDEWINDOW = 0x0080;
        public const int SWP_NOCOPYBITS = 0x0100;
        public const int SWP_NOOWNERZORDER = 0x0200;  /* Don't do owner Z ordering */
        public const int SWP_NOSENDCHANGING = 0x0400;  /* Don't send WM_WINDOWPOSCHANGING */

        [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
        public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, int flags);

        public const uint WS_OVERLAPPED = WS_BORDER | WS_CAPTION;
        public const uint WS_CLIPSIBLINGS = 0x04000000;
        public const uint WS_CLIPCHILDREN = 0x02000000;
        public const uint WS_CAPTION = 0x00C00000;     /* WS_BORDER | WS_DLGFRAME  */
        public const uint WS_BORDER = 0x00800000;
        public const uint WS_DLGFRAME = 0x00400000;
        public const uint WS_VSCROLL = 0x00200000;
        public const uint WS_HSCROLL = 0x00100000;
        public const uint WS_SYSMENU = 0x00080000;
        public const uint WS_THICKFRAME = 0x00040000;
        public const uint WS_MAXIMIZEBOX = 0x00020000;
        public const uint WS_MINIMIZEBOX = 0x00010000;
        public const uint WS_SIZEBOX = WS_THICKFRAME;
        public const uint WS_POPUP = 0x80000000;
        public const uint WS_CHILD = 0x40000000;
        public const uint WS_VISIBLE = 0x10000000;
        public const uint WS_DISABLED = 0x08000000;

        public const uint WS_EX_DLGMODALFRAME = 0x00000001;
        public const uint WS_EX_TOPMOST = 0x00000008;
        public const uint WS_EX_TOOLWINDOW = 0x00000080;
        public const uint WS_EX_WINDOWEDGE = 0x00000100;
        public const uint WS_EX_CLIENTEDGE = 0x00000200;

        public const uint WS_EX_CONTEXTHELP = 0x00000400;
        public const uint WS_EX_STATICEDGE = 0x00020000;
        public const uint WS_EX_OVERLAPPEDWINDOW = (WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE);

        public const int GWL_STYLE = (-16);
        public const int GWL_EXSTYLE = (-20);

        [DllImport("user32.dll", EntryPoint = "GetWindowLong", CharSet = CharSet.Auto)]
        public static extern IntPtr GetWindowLong32(IntPtr hWnd, int nIndex);

        [DllImport("user32.dll", EntryPoint = "SetWindowLong", CharSet = CharSet.Auto)]
        public static extern IntPtr SetWindowLongPtr32(IntPtr hWnd, int nIndex, int dwNewLong);

public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam);

        public const int WH_KEYBOARD = 2;
        public const int WH_MOUSE = 7;
        public const int WH_KEYBOARD_LL = 13;
        public const int WH_MOUSE_LL = 14;

        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);

        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        public static extern bool UnhookWindowsHookEx(int idHook);

        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam);

        [StructLayout(LayoutKind.Sequential)]
        public class POINT
        {
            public int x;
            public int y;
        }

        [StructLayout(LayoutKind.Sequential)]
        public class MouseHookStruct
        {
            public POINT pt;
            public int hwnd;
            public int wHitTestCode;
            public int dwExtraInfo;
        }

        [StructLayout(LayoutKind.Sequential)]
        public class KeyboardHookStruct
        {
            public int vkCode;
            public int scanCode;
            public int flags;
            public int time;
            public int dwExtraInfo;
        }
    }

public class Hook
    {
        public delegate void KeyboardDelegate(KeyEventArgs e);
        public KeyboardDelegate OnKeyDown;
        int m_hHook = 0;
        ActiveHook.HookProc m_HookCallback;

        public void SetHook(bool enable)
        {
            if (enable && m_hHook == 0)
            {
                m_HookCallback = new ActiveHook.HookProc(HookCallbackProc);
                Module module = Assembly.GetExecutingAssembly().GetModules()[0];
                m_hHook = ActiveHook.SetWindowsHookEx(ActiveHook.WH_KEYBOARD_LL, m_HookCallback, Marshal.GetHINSTANCE(module), 0);
                return;
            }

            if (enable == false && m_hHook != 0)
            {
                ActiveHook.UnhookWindowsHookEx(m_hHook);
                m_hHook = 0;
            }
        }
        int HookCallbackProc(int nCode, IntPtr wParam, IntPtr lParam)
        {
            if (nCode < 0)
            {
                return ActiveHook.CallNextHookEx(m_hHook, nCode, wParam, lParam);
            }
            else
            {
                ActiveHook.KeyboardHookStruct hookstruct = (ActiveHook.KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(ActiveHook.KeyboardHookStruct));

                if (OnKeyDown != null && wParam.ToInt32() == ActiveHook.WM_KEYDOWN)
                {
                    Keys key = (Keys)hookstruct.vkCode;
                    if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift)
                        key |= Keys.Shift;
                    if ((Control.ModifierKeys & Keys.Control) == Keys.Control)
                        key |= Keys.Control;
                     if ((Control.ModifierKeys & Keys.Alt) == Keys.Alt)
                         key |= Keys.Alt;

                    KeyEventArgs e = new KeyEventArgs(key);
                    e.Handled = false;
                    OnKeyDown(e);
                    if (e.Handled)
                        return 1;
                }
                int result = 0;
                if (m_hHook != 0)
                    result = ActiveHook.CallNextHookEx(m_hHook, nCode, wParam, lParam);
                return result;
            }
        }
    }
}

代码有点多,可是是核心代码。能够作为參考。


project採用SHARPDEVELOP开发,32位操作系统检验通过。

须要具体资料能够登录到IT部落格

IT部落格(http://www.itbuluoge.com)-快乐高速学习,专注于免费编程教程,在线编程,IT面试笔记,IT面试经验

posted @ 2014-06-20 10:46  mfrbuaa  阅读(967)  评论(0编辑  收藏  举报