C# TreeGridView 实现进程列表

时间:2021-07-08 22:09:39

效果如图

C# TreeGridView 实现进程列表

0x01 获取进程列表,使用Win32Api规避"拒绝访问"异常

public List<AppProcess> GetAppProcesses()
{
IntPtr handle = NativeMethods.CreateToolhelp32Snapshot(0x2, );
List<ProcessEntry32> list = new List<ProcessEntry32>();
List<AppProcess> applist = new List<AppProcess>();
if ((int)handle > )
{
ProcessEntry32 pe32 = new ProcessEntry32();
pe32.dwSize = (uint)Marshal.SizeOf(pe32);
int bMore = NativeMethods.Process32First(handle, ref pe32);
while (bMore == )
{
ProcessEntry32 pe = pe32.MarshalEx();
//排除掉[System Process]
if (pe.th32ProcessID > )
{
IntPtr processHandle = NativeMethods.OpenProcess(NativeMethods.PROCESS_ALL_ACCESS, true, pe.th32ProcessID);
//排除掉无法访问的
if (processHandle != IntPtr.Zero)
{
pe.processHandle = processHandle;
list.Add(pe);
}
else
{
var err = Marshal.GetLastWin32Error();
applist.Add(new AppProcess { 进程ID = pe.th32ProcessID, 文件名 = pe.szExeFile, 父级进程ID = pe.th32ParentProcessID });
}
}
bMore = NativeMethods.Process32Next(handle, ref pe32);
}
}
NativeMethods.CloseHandle(handle);
foreach (ProcessEntry32 p in list)
{
var processHandle = p.processHandle;
var winExePath = new StringBuilder();
var len = NativeMethods.GetModuleFileNameEx(processHandle, IntPtr.Zero, winExePath, (uint)winExePath.Capacity);
if (len > )
{
var path = winExePath.ToString();
var baseName = p.szExeFile;
var description = "";
var manifuture = "";
try
{
var err = ;
var baseNameSb = new StringBuilder();
var nameLen = NativeMethods.GetModuleBaseName(new SafeProcessHandle(processHandle, false), , baseNameSb, baseNameSb.Capacity);
if (nameLen > )
{
baseName = baseNameSb.ToString();
}
else
{
err = Marshal.GetLastWin32Error();
}
PROCESS_BASIC_INFORMATION pbi = new PROCESS_BASIC_INFORMATION();
int sizeInfoReturned;
int queryStatus = NativeMethods.NtQueryInformationProcess(processHandle, (PROCESSINFOCLASS), ref pbi, Marshal.SizeOf(pbi), out sizeInfoReturned);
NativeMethods.CloseHandle(processHandle);
var peb = pbi.PebBaseAddress; FileVersionInfo info = FileVersionInfo.GetVersionInfo(path);
description = info.FileDescription;
manifuture = info.CompanyName;
}
catch (FileNotFoundException)
{ }
catch (Exception ex)
{ }
applist.Add(new AppProcess { 制造商 = manifuture, 进程ID = p.th32ProcessID, 文件名 = baseName, 自身描述 = description, 文件路径 = path, 父级进程ID = p.th32ParentProcessID > ? p.th32ParentProcessID : (uint?)null });
}
else
{
var err = Marshal.GetLastWin32Error();
Console.WriteLine("进程" + p + " 获取模块路径失败。错误代码" + err);
}
}
return applist;
}

0x02 递归将列表转为树结构

private void SetSubItems(IEnumerable<AppProcess> rootList, IEnumerable<AppProcess> plist)
{
foreach (var rootItem in rootList)
{
foreach (var item in plist)
{
if (item.父级进程ID == rootItem.进程ID)
{
rootItem.SubItems.Add(item);
}
}
SetSubItems(rootItem.SubItems, plist);
}
}

0x03 递归树结构绑定到控件节点

private void SetNodes(IEnumerable<AppProcess> rootList, TreeGridNodeCollection nodes)
{
foreach (var item in rootList)
{
var node = nodes.Add(item.文件名, item.进程ID, item.文件路径, item.制造商, item.自身描述);
node.ImageIndex = ;
SetNodes(item.SubItems, node.Nodes);
}
}

群共享获取源码 .Net软件小组 283590657

C# TreeGridView 实现进程列表的更多相关文章

  1. iphone获取当前运行进程列表

    通过调用 sys/sysctl.h 读取系统内核获取进程列表 . 代码悦德财富:https://yuedecaifu.com 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 ...

  2. delphi中获得进程列表或想要的进程&lpar;枚举进程、遍历进程&rpar;

    一个常见的编程任务是枚举所有运行的"应用程序".Windows 任务管理器就是一个很好的例子.它用两种方式列出"应用程序".任务管理器的第一个选项卡列出桌面上的 ...

  3. top命令查看进程列表

    top命令查看进程列表 top命令是linux下常用的性能分析工具,能实时显示系统中各个进程的资源占用状况.和win的资源管理器类似.top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态,如 ...

  4. android 查看手机运行的进程列表

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools=&q ...

  5. Linux守护进程列表&sol;守护进程

      在linux或者unix操作系统中在系统引导的时候会开启很多服务,这些服务就叫做守护进程.为了增加灵活性,root可以选择系统开启的模式,这些模式叫做运行级别,每一种运行级别以一定的方式配置系统. ...

  6. Qt 扫描进程列表以及获取进程信息

    使用方法: QMap<QString,qint64> app_pid; getAllAppPidList( app_pid ); #include <tlhelp32.h>// ...

  7. c&num;读取进程列表判断程序是否已经启动(转)

    方法一: using System.Diagnostics; Process[] vProcesses = Process.GetProcesses(); foreach (Process vProc ...

  8. UNIX环境高级编程——守护进程列表

    amd:自动安装NFS(网络文件系统)守侯进程apmd:高级电源治理Arpwatch:记录日志并构建一个在LAN接口上看到的以太网地址和ip地址对数据库Autofs:自动安装治理进程automount ...

  9. edgedb 内部pg 数据存储的探索 &lpar;五&rpar; 运行进程列表信息

    做为一个简单的记录,方便后期分析学习 当前包含了一个timescale 的extension 可以不用关注 信息 ps -ef |grep edgedb edgedb 10559 24858 0 4月 ...

随机推荐

  1. oracle 常用函数【转】

    常用Oracle函数 SQL中的单记录函数 1.ASCII 返回与指定的字符对应的十进制数; SQL> select ascii('A') A,ascii('a') a,ascii('0') z ...

  2. ZIP等

    file命令可以查看文件的类型 tar类型 .targzip类型 .gz bzip2类型 .bz2zip类型 .zip 如果一个压缩文件由tar命令解压的前提,2个条件1.这个文件必须是由tar打包之 ...

  3. 个人总结ANDROID开发事项

    theme:none,Holo Dark(全黑),Holo Light(全白),Holo Light width Dark action Bar(全白,活动栏是黑) Create Activity: ...

  4. Cocos2d-x内置粒子系统

    从类图中我们可以看到,Cocos2d-x中有内置的11粒子,这些粒子的属性都是预先定义好的,我们也可以在程序代码中单独修改某些属性,我们在上一节的实例中都已经实现了这些属性的设置. 内置粒子系统 内置 ...

  5. &lt&semi;转&gt&semi;DNS SOA记录

    http://www.sigma.me/2011/01/01/about_dns_soa.html 今天登入google webmaster,发现有好多crawl错误,一看,都是Domain name ...

  6. 序列数据挖掘&lbrack;ZZ&rsqb;

    一.时间序列数据挖掘 时间序列是数据存在的特殊形式,序列的过去值会影响到将来值,这种影响的大小以及影响的方式可由时间序列中的趋势周期及非平稳等行为来刻画.一般来讲,时间序列数据都具有躁声.不稳定.随机 ...

  7. C&num; base和this&lbrack;转&rsqb;

    new关键字引起了大家的不少关注,尤其感谢Anders Liu的补充,让我感觉博客园赋予的交流平台真的无所不在.所以,我们就有必要继续这个话题,把我认为最值得关注的关键字开展下去,本文的重点是访问关键 ...

  8. 页面新宠图片格式WebP

    WebP格式,谷歌(google)开发的一种旨在加快图片加载速度的图片格式.图片压缩体积大约只有JPEG的2/3,并能节省大量的服务器带宽资源和数据空间.Facebook Ebay等知名网站已经开始测 ...

  9. 四, 判断语句; 循环; 使用dict和set

    1)  练习 小明身高1.75,体重80.5kg.请根据BMI公式(体重除以身高的平方)帮小明计算他的BMI指数,并根据BMI指数: 低于18.5:过轻 18.5-25:正常 25-28:过重 28- ...

  10. 如何查看C&plus;&plus; dll位数

    使用VS自带工具 dumpbin dumpbin /headers xxx.dll