1)可以查看进程的各项基本信息,如cpu,内存,父进程,执行路径,创建者等
2)可以中止进程,创建新进程
3)可以配置目标进程,配置刷新速度
最终效果图:
WinForm--使用C#制做进程监视器

(以下给出部分代码,其余像进程的创建、中止等,使用process类将很容易实现)
1)使用wmi获取父进程id,进程创建者
(注意,使用wmi获得的内容,不宜循环刷新,这样代价比较大)
添加命名空间:
using System.Management;

WinForm--使用C#制做进程监视器
WinForm--使用C#制做进程监视器       
/// <summary>
WinForm--使用C#制做进程监视器       
/// 使用Wmi获取指定进程的创建者等信息
WinForm--使用C#制做进程监视器       
/// </summary>
WinForm--使用C#制做进程监视器       
/// <param name="pID">进程ID</param>
WinForm--使用C#制做进程监视器        private void FillDetailUseWmi(int pID)
WinForm--使用C#制做进程监视器       
{
WinForm--使用C#制做进程监视器            ManagementObjectSearcher searcher
= new ManagementObjectSearcher("Select * From Win32_Process Where ProcessID="
+ pID);
WinForm--使用C#制做进程监视器            ManagementObjectCollection moc
= searcher.Get();
WinForm--使用C#制做进程监视器
WinForm--使用C#制做进程监视器            ManagementOperationObserver observer
= new ManagementOperationObserver();
WinForm--使用C#制做进程监视器            HandleObjectReady hor
= new HandleObjectReady();
WinForm--使用C#制做进程监视器           
//监测异步方法是否已成功返回
WinForm--使用C#制做进程监视器
            observer.ObjectReady += new ObjectReadyEventHandler(hor.Done);
WinForm--使用C#制做进程监视器
WinForm--使用C#制做进程监视器           
foreach (ManagementObject mo in moc)
WinForm--使用C#制做进程监视器           
{
WinForm--使用C#制做进程监视器               
//异步调用该对象的GetOwner方法,获取进程创建者
WinForm--使用C#制做进程监视器
                mo.InvokeMethod(observer, "GetOwner", null);
WinForm--使用C#制做进程监视器               
//等待异步调用返回
WinForm--使用C#制做进程监视器               
while (!hor.Complete)
WinForm--使用C#制做进程监视器               
{
WinForm--使用C#制做进程监视器                    System.Threading.Thread.Sleep(
500);
WinForm--使用C#制做进程监视器                }

WinForm--使用C#制做进程监视器
WinForm--使用C#制做进程监视器               
string user = "";
WinForm--使用C#制做进程监视器               
//判断获取用户名的操作是否成功
WinForm--使用C#制做进程监视器               
if (hor.Obj["returnValue"].ToString() == "0")
WinForm--使用C#制做进程监视器               
{
WinForm--使用C#制做进程监视器                    user
= hor.Obj.Properties["User"].Value.ToString();
WinForm--使用C#制做进程监视器                }

WinForm--使用C#制做进程监视器               
//判断字典中是否已移除该项
WinForm--使用C#制做进程监视器               
if (!this.mDict.ContainsKey(pID))
WinForm--使用C#制做进程监视器               
{
WinForm--使用C#制做进程监视器                   
return;
WinForm--使用C#制做进程监视器                }

WinForm--使用C#制做进程监视器               
if (mo["ParentProcessID"] != null && this.mDict.ContainsKey(Convert.ToInt32(mo["ParentProcessID"])))
WinForm--使用C#制做进程监视器               
{
WinForm--使用C#制做进程监视器                   
//根据父进程ID获取父进程名称
WinForm--使用C#制做进程监视器                   
this.mDict[pID].ParentProce = this.mDict[Convert.ToInt32(mo["ParentProcessID"])].ProceName;
WinForm--使用C#制做进程监视器                }

WinForm--使用C#制做进程监视器               
this.mDict[pID].Creator = user;
WinForm--使用C#制做进程监视器
WinForm--使用C#制做进程监视器               
//触发刷新进程详细信息事件
WinForm--使用C#制做进程监视器               
if (this.HandleDetailList != null)
WinForm--使用C#制做进程监视器               
{
WinForm--使用C#制做进程监视器                   
this.HandleDetailList(this.mDict[pID]);
WinForm--使用C#制做进程监视器                }

WinForm--使用C#制做进程监视器            }

WinForm--使用C#制做进程监视器
WinForm--使用C#制做进程监视器           
//释放资源
WinForm--使用C#制做进程监视器
            searcher.Dispose();
WinForm--使用C#制做进程监视器            searcher
= null;
WinForm--使用C#制做进程监视器            moc.Dispose();
WinForm--使用C#制做进程监视器            moc
= null;
WinForm--使用C#制做进程监视器            observer
= null;
WinForm--使用C#制做进程监视器            hor
= null;
WinForm--使用C#制做进程监视器        }

WinForm--使用C#制做进程监视器
WinForm--使用C#制做进程监视器
WinForm--使用C#制做进程监视器   
/// <summary>
WinForm--使用C#制做进程监视器   
/// 该类用于监测Wmi异步调用方法是否已经返回
WinForm--使用C#制做进程监视器   
/// </summary>
WinForm--使用C#制做进程监视器    public class HandleObjectReady
WinForm--使用C#制做进程监视器   
{
WinForm--使用C#制做进程监视器       
private bool complete = false;
WinForm--使用C#制做进程监视器       
private ManagementBaseObject obj;
WinForm--使用C#制做进程监视器
WinForm--使用C#制做进程监视器       
public void Done(object sender, ObjectReadyEventArgs e)
WinForm--使用C#制做进程监视器       
{
WinForm--使用C#制做进程监视器            complete
= true;
WinForm--使用C#制做进程监视器            obj
= e.NewObject;
WinForm--使用C#制做进程监视器        }

WinForm--使用C#制做进程监视器
WinForm--使用C#制做进程监视器       
public bool Complete
WinForm--使用C#制做进程监视器       
{
WinForm--使用C#制做进程监视器           
get
WinForm--使用C#制做进程监视器           
{
WinForm--使用C#制做进程监视器               
return complete;
WinForm--使用C#制做进程监视器            }

WinForm--使用C#制做进程监视器        }

WinForm--使用C#制做进程监视器
WinForm--使用C#制做进程监视器       
public ManagementBaseObject Obj
WinForm--使用C#制做进程监视器       
{
WinForm--使用C#制做进程监视器           
get
WinForm--使用C#制做进程监视器           
{
WinForm--使用C#制做进程监视器               
return obj;
WinForm--使用C#制做进程监视器            }

WinForm--使用C#制做进程监视器        }

WinForm--使用C#制做进程监视器    }

WinForm--使用C#制做进程监视器
WinForm--使用C#制做进程监视器



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;

WinForm--使用C#制做进程监视器
WinForm--使用C#制做进程监视器       
/// <summary>
WinForm--使用C#制做进程监视器       
/// 性能计数器,用于获取CPU空闲百分比
WinForm--使用C#制做进程监视器       
/// </summary>
WinForm--使用C#制做进程监视器        private static PerformanceCounter mIdle = new PerformanceCounter("Process", "% Processor Time", "Idle");
WinForm--使用C#制做进程监视器       
/// <summary>
WinForm--使用C#制做进程监视器       
/// 性能计数器,用于获取CPU总利用率
WinForm--使用C#制做进程监视器       
/// </summary>
WinForm--使用C#制做进程监视器        private static PerformanceCounter mTotal = new PerformanceCounter("Process", "% Processor Time", "_Total");
WinForm--使用C#制做进程监视器
WinForm--使用C#制做进程监视器       
private void FillNeedRefreshInfo(params Process[] pCurrentAll)
WinForm--使用C#制做进程监视器       
{
WinForm--使用C#制做进程监视器            …………
WinForm--使用C#制做进程监视器           
//以下计算CPU利用率
WinForm--使用C#制做进程监视器           
this.mCurrentTotalCpuTime = this.CalCurrentTotalCpuTime();
WinForm--使用C#制做进程监视器           
for (int i = 0; i < pCurrentAll.Length; i++)
WinForm--使用C#制做进程监视器           
{
WinForm--使用C#制做进程监视器               
//空闲进程idle
WinForm--使用C#制做进程监视器               
if (pCurrentAll.Id == 0)
WinForm--使用C#制做进程监视器               
{
WinForm--使用C#制做进程监视器                   
this.mDict[pCurrentAll.Id].CpuPercent = this.mIdleCpuPercent;
WinForm--使用C#制做进程监视器                }

WinForm--使用C#制做进程监视器               
else
WinForm--使用C#制做进程监视器               
{
WinForm--使用C#制做进程监视器                   
try
WinForm--使用C#制做进程监视器                   
{
WinForm--使用C#制做进程监视器                       
//无法保证进程不会中途退出,此时无法获取其Cpu时间
WinForm--使用C#制做进程监视器                       
long ms = (long)pCurrentAll.TotalProcessorTime.TotalMilliseconds;
WinForm--使用C#制做进程监视器                       
double d = (ms - this.mDict[pCurrentAll.Id].OldCpuTime) * 1.0 / this.mCurrentTotalCpuTime;
WinForm--使用C#制做进程监视器                       
this.mDict[pCurrentAll.Id].CpuPercent = d;
WinForm--使用C#制做进程监视器                       
this.mDict[pCurrentAll.Id].OldCpuTime = ms;
WinForm--使用C#制做进程监视器                    }

WinForm--使用C#制做进程监视器                   
catch
WinForm--使用C#制做进程监视器                   
{
WinForm--使用C#制做进程监视器                    }

WinForm--使用C#制做进程监视器                }

WinForm--使用C#制做进程监视器
WinForm--使用C#制做进程监视器               
//调用刷新事件
WinForm--使用C#制做进程监视器               
if (this.HandleProceRefresh != null)
WinForm--使用C#制做进程监视器               
{
WinForm--使用C#制做进程监视器                   
this.HandleProceRefresh(this.mDict[pCurrentAll.Id], 100 - this.mIdleCpuPercent);
WinForm--使用C#制做进程监视器                }

WinForm--使用C#制做进程监视器            }

WinForm--使用C#制做进程监视器        }

WinForm--使用C#制做进程监视器
WinForm--使用C#制做进程监视器
WinForm--使用C#制做进程监视器       
private double CalCurrentTotalCpuTime()
WinForm--使用C#制做进程监视器       
{
WinForm--使用C#制做进程监视器           
double d = 0;
WinForm--使用C#制做进程监视器           
//获取性能计数器值
WinForm--使用C#制做进程监视器           
double idlePercent = mIdle.NextValue();
WinForm--使用C#制做进程监视器           
double totalPercent = mTotal.NextValue();
WinForm--使用C#制做进程监视器           
//避免除0异常
WinForm--使用C#制做进程监视器           
if (totalPercent == 0)
WinForm--使用C#制做进程监视器           
{
WinForm--使用C#制做进程监视器               
this.mIdleCpuPercent = 0;
WinForm--使用C#制做进程监视器            }

WinForm--使用C#制做进程监视器           
else
WinForm--使用C#制做进程监视器           
{
WinForm--使用C#制做进程监视器               
//可能遇到多核或超线程CPU,CPU空闲进程比率不能直接使用计数器的值
WinForm--使用C#制做进程监视器               
this.mIdleCpuPercent = idlePercent * 100 / totalPercent;
WinForm--使用C#制做进程监视器            }

WinForm--使用C#制做进程监视器
WinForm--使用C#制做进程监视器           
//以下获取上一次计算至当前总的非空闲CPU时间
WinForm--使用C#制做进程监视器           
foreach (Process p in this.mCurrentAll)
WinForm--使用C#制做进程监视器           
{
WinForm--使用C#制做进程监视器               
//对空闲进程及中途退出的进程不做处理
WinForm--使用C#制做进程监视器               
if (p.Id == 0 || p.HasExited)
WinForm--使用C#制做进程监视器               
{
WinForm--使用C#制做进程监视器                   
continue;
WinForm--使用C#制做进程监视器                }

WinForm--使用C#制做进程监视器
WinForm--使用C#制做进程监视器               
if (this.mDict ==null || !this.mDict.ContainsKey(p.Id))
WinForm--使用C#制做进程监视器               
{
WinForm--使用C#制做进程监视器                    d
+= p.TotalProcessorTime.TotalMilliseconds;
WinForm--使用C#制做进程监视器                }

WinForm--使用C#制做进程监视器               
else
WinForm--使用C#制做进程监视器               
{
WinForm--使用C#制做进程监视器                    d
+= p.TotalProcessorTime.TotalMilliseconds - this.mDict[p.Id].OldCpuTime;
WinForm--使用C#制做进程监视器                }

WinForm--使用C#制做进程监视器            }

WinForm--使用C#制做进程监视器
WinForm--使用C#制做进程监视器           
//当前非空闲CPU时间/当前非空闲时间所占比率=当前总CPU时间
WinForm--使用C#制做进程监视器           
//return d / (totalPercent - idlePercent);
WinForm--使用C#制做进程监视器           
return d / (100 - mIdleCpuPercent);
WinForm--使用C#制做进程监视器        }

相关文章:

  • 2021-11-22
  • 2021-06-10
  • 2021-11-10
  • 2022-12-23
  • 2022-12-23
  • 2021-08-13
  • 2021-08-21
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-10-29
  • 2021-12-10
相关资源
相似解决方案