日历

2008 7.4 Fri
  12345
6789101112
13141516171819
20212223242526
2728293031  
«» 2008 - 7 «»

日志分类

文章搜索

日志文章

2008年03月25日 20:06:45

C#制做进程监视器

C#制做进程监视器
1)可以查看进程的各项基本信息,如cpu,内存,父进程,执行路径,创建者等

2)可以中止进程,创建新进程

3)可以配置目标进程,配置刷新速度

最终效果图:



2)使用性能计数器计算cpu利用率

2.1)计算过程

//通过计数器获取idle空闲进程cpu占用率r1

//通过process类的TotalProcessorTime属性获取各进程的cpu时间,求和,得各进程(除空闲进程idle,该进程无法通过process类获得cpu时间)cpu时间和t1

//通过t1/(100-r1)得到总cpu时间t

//对各进程,通过TotalProcessorTime获得进程cpu时间tnew,计算:

(Tnew-told)/t,即得该进程的cpu占用率,其中told是程序中记录的该进程上一次的TotalProcessorTime



2.2)关于性能计数器

系统会为每个进程分配一个计数器,通过

new PerformanceCounter("Process", "% Processor Time", "进程名称")实例化该计数器,使用计数器对象的NextValue方法可以得到进程占用cpu的百分比(第一次调用NextValue获取的值都为0,之后就没问题了,这个要注意)。



2.3)Idle进程的含义

Idle意为懒散的、无所事事。事实上,idle不能算着一个进程,它用于表示cpu空闲资源,它所占的比率越高,表示你的机器越空闲。



2.4)多核CPU或使用超线程技术的CPU

对于多核或使用超线程技术的cpu,根据计数器求得的idle进程cpu占用比率将超过100%,此时应将idlecpu利用率/总的cpu利用率,所得作为真正的idlecpu利用率。

添加命名空间:

using System.Diagnostics;


    /**//// <summary>
    /// 性能计数器,用于获取CPU空闲百分比
    /// </summary>
    private static PerformanceCounter mIdle = new PerformanceCounter("Process", "% Processor Time", "Idle");
    /**//// <summary>
    /// 性能计数器,用于获取CPU总利用率
    /// </summary>
    private static PerformanceCounter mTotal = new PerformanceCounter("Process", "% Processor Time", "_Total");

    private void FillNeedRefreshInfo(params Process[] pCurrentAll)
    {
        …………
        //以下计算CPU利用率
        this.mCurrentTotalCpuTime = this.CalCurrentTotalCpuTime();
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]         for (int i = 0; i < pCurrentAll.Length; i++)
[img]http://www.itwis.com/upimg/allimg/080325/15015720.gif[/img][img]http://www.itwis.com/upimg/allimg/080325/15015721.gif[/img]         [img]http://www.itwis.com/upimg/allimg/080325/15015710.gif[/img]{
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]           //空闲进程idle
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]           if (pCurrentAll.Id == 0)
[img]http://www.itwis.com/upimg/allimg/080325/15015720.gif[/img][img]http://www.itwis.com/upimg/allimg/080325/15015721.gif[/img]           [img]http://www.itwis.com/upimg/allimg/080325/15015710.gif[/img]{
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]             this.mDict[pCurrentAll.Id].CpuPercent = this.mIdleCpuPercent;
[img]http://www.itwis.com/upimg/allimg/080325/15015731.gif[/img]           }
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]           else
[img]http://www.itwis.com/upimg/allimg/080325/15015720.gif[/img][img]http://www.itwis.com/upimg/allimg/080325/15015721.gif[/img]           [img]http://www.itwis.com/upimg/allimg/080325/15015710.gif[/img]{
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]             try
[img]http://www.itwis.com/upimg/allimg/080325/15015720.gif[/img][img]http://www.itwis.com/upimg/allimg/080325/15015721.gif[/img]             [img]http://www.itwis.com/upimg/allimg/080325/15015710.gif[/img]{
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]                 //无法保证进程不会中途退出,此时无法获取其Cpu时间
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]                 long ms = (long)pCurrentAll.TotalProcessorTime.TotalMilliseconds;
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]                 double d = (ms - this.mDict[pCurrentAll.Id].OldCpuTime) * 1.0 / this.mCurrentTotalCpuTime;
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]                 this.mDict[pCurrentAll.Id].CpuPercent = d;
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]                 this.mDict[pCurrentAll.Id].OldCpuTime = ms;
[img]http://www.itwis.com/upimg/allimg/080325/15015731.gif[/img]             }
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]             catch
[img]http://www.itwis.com/upimg/allimg/080325/15015720.gif[/img][img]http://www.itwis.com/upimg/allimg/080325/15015721.gif[/img]             [img]http://www.itwis.com/upimg/allimg/080325/15015710.gif[/img]{
[img]http://www.itwis.com/upimg/allimg/080325/15015731.gif[/img]             }
[img]http://www.itwis.com/upimg/allimg/080325/15015731.gif[/img]           }
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]           //调用刷新事件
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]           if (this.HandleProceRefresh != null)
[img]http://www.itwis.com/upimg/allimg/080325/15015720.gif[/img][img]http://www.itwis.com/upimg/allimg/080325/15015721.gif[/img]           [img]http://www.itwis.com/upimg/allimg/080325/15015710.gif[/img]{
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]             this.HandleProceRefresh(this.mDict[pCurrentAll.Id], 100 - this.mIdleCpuPercent);
[img]http://www.itwis.com/upimg/allimg/080325/15015731.gif[/img]           }
[img]http://www.itwis.com/upimg/allimg/080325/15015731.gif[/img]         }
[img]http://www.itwis.com/upimg/allimg/080325/1501576.gif[/img]     }
[img]http://www.itwis.com/upimg/allimg/080325/1501571.gif[/img]
[img]http://www.itwis.com/upimg/allimg/080325/1501571.gif[/img]
[img]http://www.itwis.com/upimg/allimg/080325/1501571.gif[/img]     private double CalCurrentTotalCpuTime()
[img]http://www.itwis.com/upimg/allimg/080325/1501572.gif[/img][img]http://www.itwis.com/upimg/allimg/080325/1501573.gif[/img]     [img]http://www.itwis.com/upimg/allimg/080325/15015710.gif[/img]{
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]         double d = 0;
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]         //获取性能计数器值
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]         double idlePercent = mIdle.NextValue();
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]         double totalPercent = mTotal.NextValue();
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]         //避免除0异常
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]         if (totalPercent == 0)
[img]http://www.itwis.com/upimg/allimg/080325/15015720.gif[/img][img]http://www.itwis.com/upimg/allimg/080325/15015721.gif[/img]         [img]http://www.itwis.com/upimg/allimg/080325/15015710.gif[/img]{
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]           this.mIdleCpuPercent = 0;
[img]http://www.itwis.com/upimg/allimg/080325/15015731.gif[/img]         }
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]         else
[img]http://www.itwis.com/upimg/allimg/080325/15015720.gif[/img][img]http://www.itwis.com/upimg/allimg/080325/15015721.gif[/img]         [img]http://www.itwis.com/upimg/allimg/080325/15015710.gif[/img]{
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]           //可能遇到多核或超线程CPU,CPU空闲进程比率不能直接使用计数器的值
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]           this.mIdleCpuPercent = idlePercent * 100 / totalPercent;
[img]http://www.itwis.com/upimg/allimg/080325/15015731.gif[/img]         }
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]         //以下获取上一次计算至当前总的非空闲CPU时间
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]         foreach (Process p in this.mCurrentAll)
[img]http://www.itwis.com/upimg/allimg/080325/15015720.gif[/img][img]http://www.itwis.com/upimg/allimg/080325/15015721.gif[/img]         [img]http://www.itwis.com/upimg/allimg/080325/15015710.gif[/img]{
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]           //对空闲进程及中途退出的进程不做处理
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]           if (p.Id == 0 || p.HasExited)
[img]http://www.itwis.com/upimg/allimg/080325/15015720.gif[/img][img]http://www.itwis.com/upimg/allimg/080325/15015721.gif[/img]           [img]http://www.itwis.com/upimg/allimg/080325/15015710.gif[/img]{
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]             continue;
[img]http://www.itwis.com/upimg/allimg/080325/15015731.gif[/img]           }
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]           if (this.mDict ==null || !this.mDict.ContainsKey(p.Id))
[img]http://www.itwis.com/upimg/allimg/080325/15015720.gif[/img][img]http://www.itwis.com/upimg/allimg/080325/15015721.gif[/img]           [img]http://www.itwis.com/upimg/allimg/080325/15015710.gif[/img]{
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]             d += p.TotalProcessorTime.TotalMilliseconds;
[img]http://www.itwis.com/upimg/allimg/080325/15015731.gif[/img]           }
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]           else
[img]http://www.itwis.com/upimg/allimg/080325/15015720.gif[/img][img]http://www.itwis.com/upimg/allimg/080325/15015721.gif[/img]           [img]http://www.itwis.com/upimg/allimg/080325/15015710.gif[/img]{
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]             d += p.TotalProcessorTime.TotalMilliseconds - this.mDict[p.Id].OldCpuTime;
[img]http://www.itwis.com/upimg/allimg/080325/15015731.gif[/img]           }
[img]http://www.itwis.com/upimg/allimg/080325/15015731.gif[/img]         }
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]         //当前非空闲CPU时间/当前非空闲时间所占比率=当前总CPU时间
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]         //return d / (totalPercent - idlePercent);
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]         return d / (100 - mIdleCpuPercent);
[img]http://www.itwis.com/upimg/allimg/080325/1501576.gif[/img]     }
[img]http://www.itwis.com/upimg/allimg/080325/1501571.gif[/img]
[img]http://www.itwis.com/upimg/allimg/080325/1501571.gif[/img]



(以下给出部分代码,其余像进程的创建、中止等,使用process类将很容易实现)

1)使用wmi获取父进程id,进程创建者

(注意,使用wmi获得的内容,不宜循环刷新,这样代价比较大)

添加命名空间:

using System.Management;


[img]http://www.itwis.com/upimg/allimg/080325/1501571.gif[/img]
[img]http://www.itwis.com/upimg/allimg/080325/1501572.gif[/img][img]http://www.itwis.com/upimg/allimg/080325/1501573.gif[/img]     /**//// <summary>
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]     /// 使用Wmi获取指定进程的创建者等信息
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]     /// </summary>
[img]http://www.itwis.com/upimg/allimg/080325/1501576.gif[/img]     /// <param name="pID">进程ID</param>
[img]http://www.itwis.com/upimg/allimg/080325/1501571.gif[/img]     private void FillDetailUseWmi(int pID)
[img]http://www.itwis.com/upimg/allimg/080325/1501572.gif[/img][img]http://www.itwis.com/upimg/allimg/080325/1501573.gif[/img]     [img]http://www.itwis.com/upimg/allimg/080325/15015710.gif[/img]{
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]         ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * From Win32_Process Where ProcessID=" + pID);
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]         ManagementObjectCollection moc = searcher.Get();
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]         ManagementOperationObserver observer = new ManagementOperationObserver();
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]         HandleObjectReady hor = new HandleObjectReady();
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]         //监测异步方法是否已成功返回
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]         observer.ObjectReady += new ObjectReadyEventHandler(hor.Done);
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]         foreach (ManagementObject mo in moc)
[img]http://www.itwis.com/upimg/allimg/080325/15015720.gif[/img][img]http://www.itwis.com/upimg/allimg/080325/15015721.gif[/img]         [img]http://www.itwis.com/upimg/allimg/080325/15015710.gif[/img]{
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]           //异步调用该对象的GetOwner方法,获取进程创建者
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]           mo.InvokeMethod(observer, "GetOwner", null);
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]           //等待异步调用返回
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]           while (!hor.Complete)
[img]http://www.itwis.com/upimg/allimg/080325/15015720.gif[/img][img]http://www.itwis.com/upimg/allimg/080325/15015721.gif[/img]           [img]http://www.itwis.com/upimg/allimg/080325/15015710.gif[/img]{
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]             System.Threading.Thread.Sleep(500);
[img]http://www.itwis.com/upimg/allimg/080325/15015731.gif[/img]           }
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]           string user = "";
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]           //判断获取用户名的操作是否成功
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]           if (hor.Obj["returnValue"].ToString() == "0")
[img]http://www.itwis.com/upimg/allimg/080325/15015720.gif[/img][img]http://www.itwis.com/upimg/allimg/080325/15015721.gif[/img]           [img]http://www.itwis.com/upimg/allimg/080325/15015710.gif[/img]{
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]             user = hor.Obj.Properties["User"].Value.ToString();
[img]http://www.itwis.com/upimg/allimg/080325/15015731.gif[/img]           }
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]           //判断字典中是否已移除该项
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]           if (!this.mDict.ContainsKey(pID))
[img]http://www.itwis.com/upimg/allimg/080325/15015720.gif[/img][img]http://www.itwis.com/upimg/allimg/080325/15015721.gif[/img]           [img]http://www.itwis.com/upimg/allimg/080325/15015710.gif[/img]{
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]             return;
[img]http://www.itwis.com/upimg/allimg/080325/15015731.gif[/img]           }
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]           if (mo["ParentProcessID"] != null && this.mDict.ContainsKey(Convert.ToInt32(mo["ParentProcessID"])))
[img]http://www.itwis.com/upimg/allimg/080325/15015720.gif[/img][img]http://www.itwis.com/upimg/allimg/080325/15015721.gif[/img]           [img]http://www.itwis.com/upimg/allimg/080325/15015710.gif[/img]{
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]             //根据父进程ID获取父进程名称
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]             this.mDict[pID].ParentProce = this.mDict[Convert.ToInt32(mo["ParentProcessID"])].ProceName;
[img]http://www.itwis.com/upimg/allimg/080325/15015731.gif[/img]           }
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]           this.mDict[pID].Creator = user;
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]           //触发刷新进程详细信息事件
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]           if (this.HandleDetailList != null)
[img]http://www.itwis.com/upimg/allimg/080325/15015720.gif[/img][img]http://www.itwis.com/upimg/allimg/080325/15015721.gif[/img]           [img]http://www.itwis.com/upimg/allimg/080325/15015710.gif[/img]{
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]             this.HandleDetailList(this.mDict[pID]);
[img]http://www.itwis.com/upimg/allimg/080325/15015731.gif[/img]           }
[img]http://www.itwis.com/upimg/allimg/080325/15015731.gif[/img]         }
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]         //释放资源
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]         searcher.Dispose();
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]         searcher = null;
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]         moc.Dispose();
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]         moc = null;
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]         observer = null;
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]         hor = null;
[img]http://www.itwis.com/upimg/allimg/080325/1501576.gif[/img]     }
[img]http://www.itwis.com/upimg/allimg/080325/1501571.gif[/img]
[img]http://www.itwis.com/upimg/allimg/080325/1501571.gif[/img]
[img]http://www.itwis.com/upimg/allimg/080325/1501572.gif[/img][img]http://www.itwis.com/upimg/allimg/080325/1501573.gif[/img]   /**//// <summary>
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]   /// 该类用于监测Wmi异步调用方法是否已经返回
[img]http://www.itwis.com/upimg/allimg/080325/1501576.gif[/img]   /// </summary>
[img]http://www.itwis.com/upimg/allimg/080325/1501571.gif[/img]   public class HandleObjectReady
[img]http://www.itwis.com/upimg/allimg/080325/1501572.gif[/img][img]http://www.itwis.com/upimg/allimg/080325/1501573.gif[/img]   [img]http://www.itwis.com/upimg/allimg/080325/15015710.gif[/img]{
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]     private bool complete = false;
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]     private ManagementBaseObject obj;
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]     public void Done(object sender, ObjectReadyEventArgs e)
[img]http://www.itwis.com/upimg/allimg/080325/15015720.gif[/img][img]http://www.itwis.com/upimg/allimg/080325/15015721.gif[/img]     [img]http://www.itwis.com/upimg/allimg/080325/15015710.gif[/img]{
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]         complete = true;
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]         obj = e.NewObject;
[img]http://www.itwis.com/upimg/allimg/080325/15015731.gif[/img]     }
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]     public bool Complete
[img]http://www.itwis.com/upimg/allimg/080325/15015720.gif[/img][img]http://www.itwis.com/upimg/allimg/080325/15015721.gif[/img]     [img]http://www.itwis.com/upimg/allimg/080325/15015710.gif[/img]{
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]         get
[img]http://www.itwis.com/upimg/allimg/080325/15015720.gif[/img][img]http://www.itwis.com/upimg/allimg/080325/15015721.gif[/img]         [img]http://www.itwis.com/upimg/allimg/080325/15015710.gif[/img]{
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]           return complete;
[img]http://www.itwis.com/upimg/allimg/080325/15015731.gif[/img]         }
[img]http://www.itwis.com/upimg/allimg/080325/15015731.gif[/img]     }
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]     public ManagementBaseObject Obj
[img]http://www.itwis.com/upimg/allimg/080325/15015720.gif[/img][img]http://www.itwis.com/upimg/allimg/080325/15015721.gif[/img]     [img]http://www.itwis.com/upimg/allimg/080325/15015710.gif[/img]{
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]         get
[img]http://www.itwis.com/upimg/allimg/080325/15015720.gif[/img][img]http://www.itwis.com/upimg/allimg/080325/15015721.gif[/img]         [img]http://www.itwis.com/upimg/allimg/080325/15015710.gif[/img]{
[img]http://www.itwis.com/upimg/allimg/080325/1501574.gif[/img]           return obj;
[img]http://www.itwis.com/upimg/allimg/080325/15015731.gif[/img]         }
[img]http://www.itwis.com/upimg/allimg/080325/15015731.gif[/img]     }
[img]http://www.itwis.com/upimg/allimg/080325/1501576.gif[/img]   }
[img]http://www.itwis.com/upimg/allimg/080325/1501571.gif[/img]
[img]http://www.itwis.com/upimg/allimg/080325/1501571.gif[/img]

类别: 无分类 |  评论(0) |  浏览(245) |  收藏
发表评论