/*========================================================
* Author:myhuang
* Date:2007-02-26
* Note:获取进程主要属性值
========================================================*/
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.Management;
namespace ProceWatcher
{
/// <summary>
/// 进程类
/// </summary>
public class MyProcess
{
/// <summary>
/// 进程ID
/// </summary>
public int ProceID;
/// <summary>
/// 进程名称
/// </summary>
public string ProceName;
/// <summary>
/// 执行路径
/// </summary>
public string ExecPath;
/// <summary>
/// 创建者
/// </summary>
public string Creator;
/// <summary>
/// 创建时间
/// </summary>
public string CreateTime;
/// <summary>
/// 线程数
/// </summary>
public int ThreadsCount;
/// <summary>
/// CPU占用率
/// </summary>
public double CpuPercent;
/// <summary>
/// 上次CPU时间
/// </summary>
public long OldCpuTime;
/// <summary>
/// 物理内存(KB)
/// </summary>
public long MemoryKB;
/// <summary>
/// 虚拟内存(KB)
/// </summary>
public long VirtualKB;
/// <summary>
/// 父进程名
/// </summary>
public string ParentProce;
/// <summary>
/// 公司信息
/// </summary>
public string CompanyName;
/// <summary>
/// 是否是目标进程
/// </summary>
public bool Target;
/// <summary>
/// 是否活动
/// </summary>
public bool Active;
}
#region 委 托
public delegate void DlgProceNew(MyProcess pProce);
public delegate void DlgProceClosed(MyProcess pProce);
public delegate void DlgProceRefresh(MyProcess pProce,double pCpuPercent);
public delegate void DlgDetailList(MyProcess pProce);
#endregion
/// <summary>
/// 该类提供获取进程信息的功能
/// </summary>
public class ProcessInfo
{
#region 私有成员
/// <summary>
/// 字典类,用于保存各进程信息
/// </summary>
private Dictionary<int, MyProcess> mDict;
/// <summary>
/// 当前总CPU时间
/// </summary>
private double mCurrentTotalCpuTime;
/// <summary>
/// CPU空闲比率
/// </summary>
private double mIdleCpuPercent;
/// <summary>
/// 当前进程
/// </summary>
private Process[] mCurrentAll;
/// <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 object mLock = new object();
#endregion
#region 事 件
/// <summary>
/// 当出现新进程时触发该事件
/// </summary>
public event DlgProceNew HandleProceNew;
/// <summary>
/// 当进程关闭时触发该事件
/// </summary>
public event DlgProceClosed HandleProceClosed;
/// <summary>
/// 当进程信息更新时触发该事件
/// </summary>
public event DlgProceRefresh HandleProceRefresh;
/// <summary>
/// 当获取进程详细信息时触发该事件
/// </summary>
public event DlgDetailList HandleDetailList;
#endregion
/// <summary>
/// 构造器
/// </summary>
public ProcessInfo()
{
}
/// <summary>
/// 提供刷新进程列表的功能
/// </summary>
/// <param name="pReLoadAll">是否强制完全重新加载</param>
public void RefreshProceList(bool pReLoadAll)
{
//当前进程列表
this.mCurrentAll = Process.GetProcesses();
#region 初始化或重新加载
if (this.mDict ==null || pReLoadAll)
{
//初始化字典类
this.mDict = new Dictionary<int, MyProcess>();
//获取基本信息
this.FillBaseInfo(this.mCurrentAll);
//获取需要更新的信息
this.FillNeedRefreshInfo(this.mCurrentAll);
return;
}
#endregion
#region 进程关闭处理
//使用lock避免多线程造成mDict不一致(?)
lock (this.mLock)
{
//foreach枚举时不能删除原集合元素,记录相应的key,循环完成之后再删除
List<int> list = new List<int>();
foreach (KeyValuePair<int, MyProcess> kvp in this.mDict)
{
if (this.ProceClosedInDict(kvp.Key))
{
list.Add(kvp.Key);
}
}
MyProcess mp = null;
foreach (int id in list)
{
if (this.mDict.ContainsKey(id))
{
mp = this.mDict[id];
this.mDict.Remove(id);
//触发进程关闭事件
if (this.HandleProceClosed != null)
{
this.HandleProceClosed(mp);
}
}
}
}
#endregion
#region 进程信息刷新(包括新增)
for (int i = 0; i < this.mCurrentAll.Length; i++)
{
//新增进程
if (!this.mDict.ContainsKey(this.mCurrentAll[i].Id))
{
this.FillBaseInfo(this.mCurrentAll[i]);
}
}
this.FillNeedRefreshInfo(this.mCurrentAll);
#endregion
}
/// <summary>
/// 提供刷新进程其它详细信息的功能
/// </summary>
/// <param name="pID">进程ID</param>
public void RefreshDetailList(int pID)
{
this.FillDetailUseWmi(pID);
}
/// <summary>
/// 获取指定进程集合中各进程的基本信息
/// </summary>
/// <param name="pCurrentAll"></param>
private void FillBaseInfo(params Process[] pCurrentAll)
{
MyProcess mp = null;
for (int i = 0; i < pCurrentAll.Length; i++)
{
//判断在循环中途,是否有某一进程退出
if (this.ProceClosedInCurrentList(pCurrentAll[i]))
{
return;
}
mp = new MyProcess();
mp.ProceID = pCurrentAll[i].Id;
mp.ProceName = pCurrentAll[i].ProcessName;
try
{
//对于空闲进程idle等,无法获取其主模块文件名
mp.ExecPath = pCurrentAll[i].MainModule.FileName.ToLower();//
mp.CreateTime = pCurrentAll[i].StartTime.ToString();
mp.CompanyName = pCurrentAll[i].MainModule.FileVersionInfo.CompanyName;
}
catch
{
}
//根据执行文件路径,判断进程是否为目标进程
if (mp.ExecPath!=null && ConfigMgr.ValueExists(mp.ExecPath))
{
mp.Target = true;
}
//初始化“上一次CPU时间”为0
mp.OldCpuTime = 0;
this.mDict.Add(mp.ProceID, mp);
//触发新进程事件
if (this.HandleProceNew != null)
{
this.HandleProceNew(mp);
}
}
mp = null;
}
/// <summary>
/// 获取指定进程集合中各进程需要刷新的信息
/// </summary>
/// <param name="pCurrentAll"></param>
private void FillNeedRefreshInfo(params Process[] pCurrentAll)
{
for (int i = 0; i < pCurrentAll.Length; i++)
{
//判断在循环中途,是否有某一进程退出,及字典中是否已移除该项(?)
if (this.ProceClosedInCurrentList(pCurrentAll[i]) || !this.mDict.ContainsKey(pCurrentAll[i].Id))
{
return;
}
this.mDict[pCurrentAll[i].Id].MemoryKB = pCurrentAll[i].WorkingSet64 / 1024;
this.mDict[pCurrentAll[i].Id].VirtualKB = pCurrentAll[i].VirtualMemorySize64 / 1024;
this.mDict[pCurrentAll[i].Id].ThreadsCount = pCurrentAll[i].Threads.Count;
}
//以下计算CPU利用率,不放在同一for循环中是为了避免循环时间间隔造成CPU利用率的误差
this.mCurrentTotalCpuTime = this.CalCurrentTotalCpuTime();
for (int i = 0; i < pCurrentAll.Length; i++)
{
//空闲进程idle
if (pCurrentAll[i].Id == 0)
{
this.mDict[pCurrentAll[i].Id].CpuPercent = this.mIdleCpuPercent;
}
else
{
try
{
//无法保证进程不会中途退出,此时无法获取其CUP时间
long ms = (long)pCurrentAll[i].TotalProcessorTime.TotalMilliseconds;
double d = (ms - this.mDict[pCurrentAll[i].Id].OldCpuTime) * 1.0 / this.mCurrentTotalCpuTime;
this.mDict[pCurrentAll[i].Id].CpuPercent = d;
this.mDict[pCurrentAll[i].Id].OldCpuTime = ms;
}
catch
{
}
}
//调用刷新事件
if (this.HandleProceRefresh != null)
{
this.HandleProceRefresh(this.mDict[pCurrentAll[i].Id], 100 - this.mIdleCpuPercent);
}
}
}
/// <summary>
/// 使用Wmi获取指定进程的创建者等信息
/// </summary>
/// <param name="pID">进程ID</param>
private void FillDetailUseWmi(int pID)
{
ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * From Win32_Process Where ProcessID=" + pID);
ManagementObjectCollection moc = searcher.Get();
ManagementOperationObserver observer = new ManagementOperationObserver();
HandleObjectReady hor = new HandleObjectReady();
//监测异步方法是否已成功返回
observer.ObjectReady += new ObjectReadyEventHandler(hor.Done);
foreach (ManagementObject mo in moc)
{
//异步调用该对象的GetOwner方法,获取进程创建者
mo.InvokeMethod(observer, "GetOwner", null);
//等待异步调用返回
while (!hor.Complete)
{
System.Threading.Thread.Sleep(500);
}
string user = "";
//判断获取用户名的操作是否成功
if (hor.Obj["returnValue"].ToString() == "0")
{
user = hor.Obj.Properties["User"].Value.ToString();
}
//判断字典中是否已移除该项
if (!this.mDict.ContainsKey(pID))
{
return;
}
if (mo["ParentProcessID"] != null && this.mDict.ContainsKey(Convert.ToInt32(mo["ParentProcessID"])))
{
//根据父进程ID获取父进程名称
this.mDict[pID].ParentProce = this.mDict[Convert.ToInt32(mo["ParentProcessID"])].ProceName;
}
this.mDict[pID].Creator = user;
//触发刷新进程详细信息事件
if (this.HandleDetailList != null)
{
this.HandleDetailList(this.mDict[pID]);
}
}
//释放资源
searcher.Dispose();
searcher = null;
moc.Dispose();
moc = null;
observer = null;
hor = null;
}
/// <summary>
/// 计算当前总CPU时间
/// </summary>
/// <returns></returns>
private double CalCurrentTotalCpuTime()
{
double d = 0;
//获取性能计数器值
double idlePercent = mIdle.NextValue();
double totalPercent = mTotal.NextValue();
//避免除0异常
if (totalPercent == 0)
{
this.mIdleCpuPercent = 0;
}
else
{
//可能遇到多核或超线程CPU,CPU空闲进程比率不能直接使用计数器的值
this.mIdleCpuPercent = idlePercent * 100 / totalPercent;
}
//以下获取上一次计算至当前总的非空闲CPU时间
foreach (Process p in this.mCurrentAll)
{
//对空闲进程及中途退出的进程不做处理
if (p.Id == 0 || p.HasExited)
{
continue;
}
if (this.mDict ==null || !this.mDict.ContainsKey(p.Id))
{
d += p.TotalProcessorTime.TotalMilliseconds;
}
else
{
d += p.TotalProcessorTime.TotalMilliseconds - this.mDict[p.Id].OldCpuTime;
}
}
//当前非空闲CPU时间/当前非空闲时间所占比率=当前总CPU时间
//return d / (totalPercent - idlePercent);
return d / (100 - mIdleCpuPercent);
}
/// <summary>
/// 判断字典中所存的某个进程是否已退出
/// </summary>
/// <param name="pID"></param>
/// <returns></returns>
private bool ProceClosedInDict(int pID)
{
for (int i = 0; i < this.mCurrentAll.Length; i++)
{
if (!this.ProceClosedInCurrentList(this.mCurrentAll[i]) && this.mCurrentAll[i].Id == pID)
{
return false;
}
}
return true;
}
/// <summary>
/// 判断当前进程列表中的进程是否已中途退出
/// </summary>
/// <param name="pProce"></param>
/// <returns></returns>
private bool ProceClosedInCurrentList(Process pProce)
{
if (pProce.Id == 0)
{
return false;
}
else
{
return pProce.HasExited;
}
}
}
/// <summary>
/// 该类用于监测Wmi异步调用方法是否已经返回
/// </summary>
public class HandleObjectReady
{
private bool complete = false;
private ManagementBaseObject obj;
public void Done(object sender, ObjectReadyEventArgs e)
{
complete = true;
obj = e.NewObject;
}
public bool Complete
{
get
{
return complete;
}
}
public ManagementBaseObject Obj
{
get
{
return obj;
}
}
}
}
分享到:
相关推荐
进程监视器是一款强大的系统工具,主要用于实时监控计算机中的进程活动,包括它们的启动、运行、资源占用、网络连接等信息。这款工具对于系统管理员、软件开发者以及普通用户来说都极其有用,因为它能提供深入的系统...
【进程监视器】是系统监控领域的一个重要工具,主要用于详细追踪和记录系统中各个进程的活动。这个工具能够提供深入的洞察力,帮助用户了解系统内部的运行情况,包括文件、注册表、网络以及内存等资源的访问行为。在...
进程监视与进程守护是计算机系统管理中的重要概念,主要用于确保关键服务或应用程序的持续稳定运行。在本场景中,"进程监视器"是一款工具,它能够监控特定的进程,一旦发现该进程失去响应或者意外退出,它会自动重启...
进程监视器是计算机系统管理工具中的重要组成部分,它允许用户实时监控系统中运行的各个进程,包括它们的资源使用情况、启动时间、关联文件、网络活动等信息。这个工具对于诊断系统性能问题、查找恶意软件活动以及...
**进程监视器Process Monitor在LabVIEW中的应用与详解** LabVIEW(Laboratory Virtual Instrument Engineering Workbench)是一款由美国国家仪器公司(NI)开发的图形化编程环境,它以图标和连线的方式实现编程,...
Process Monitor一款系统进程监视软件,总体来说,Process Monitor相当于Filemon+Regmon,其中的Filemon专门用来监视系统中的任何文件操作过程,而Regmon用来监视注册表的读写操作过程。 有了Process Monitor,...
《系统进程监视器:深入解析VB编程实现》 在信息技术领域,系统进程监视是至关重要的一个环节,它允许用户实时查看并管理计算机上运行的进程。本文将详细探讨一款用VB(Visual Basic)编写的“系统进程监视器”,并...
Windows的进程监视器,通常被称为Process Monitor(进程监视器),是微软系统工具中的一款强大工具,主要用于实时监控系统中的各种进程活动。它提供了一个详细、深入的视图,揭示了系统内部发生的各种事件,包括文件...
进程监视器是一款强大的系统工具,主要用于实时监控计算机中的进程活动,包括它们的资源占用情况、启动的DLL模块、网络活动等。在编程和系统调试领域,它是一个不可或缺的辅助工具,同时也可用来检测潜在的恶意软件...
在本文中,我们将深入探讨如何使用C#编程语言制作一个进程监视器,这将帮助新手开发者更好地理解系统级编程和进程管理。C#是Microsoft开发的一种面向对象的编程语言,它提供了丰富的库和API,使得创建这样的应用程序...
超级进程监视器(天琊第一个插件).官网地址:http://www.superkill.cn/bbs/dispbbs.asp?boardid=4&id=18&star=1&page=1 卡饭发布地址: http://bbs.kafan.cn/thread-440640-1-2.html 配合瑞星防护系统,安全上网的...
Process Monitor一款系统进程监视软件,总体来说,Process Monitor相当于Filemon+Regmon,其中的Filemon专门用来监视系统 中的任何文件操作过程,而Regmon用来监视注册表的读写操作过程。 有了Process Monitor,使用...
"VB进程监视器"是一款基于Visual Basic (VB) 开发的工具,主要用于实时监控服务器上的主进程状态。这款软件的设计目标是确保服务器的关键进程始终保持运行,如果检测到主进程意外终止(DOWN状态),它能够自动采取...
"易语言双进程监视文件启动"是易语言编程中涉及的一个技术点,主要用于实现对特定文件启动的监控,确保在特定条件下,两个或多个进程可以协同工作。这种技术在系统监控、软件安全以及多任务处理等场景中有广泛应用。...
综上所述,"C# 新运行进程监视器"是一个利用C#编程语言开发的实用工具,它结合了C#的System.Diagnostics命名空间,通过Process类实现了对系统进程的监控。用户可以通过下载、解压并运行该程序,直观地了解和管理电脑...
**ProcessMonitor进程监视器详解** ProcessMonitor,通常简称为ProcMon,是由Sysinternals(现为Microsoft的一部分)开发的一款强大的实时文件系统、注册表和进程活动监控工具。它结合了原先的FileMon和RegMon的...
QT进程监视是一个基于QT框架开发的应用程序,用于在Linux或Windows等支持QT的平台上实时监控系统中的进程状态。QT是一个跨平台的C++图形用户界面应用程序开发框架,它提供了丰富的API,使得开发者能够轻松创建出美观...
在“易语言监视新进程创建”的主题中,我们主要探讨如何使用易语言来实现对计算机中新创建的进程进行实时监控。 首先,我们需要理解进程的基本概念。在操作系统中,进程是程序的一次执行实例,它包含了程序运行时所...