效果如图

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中获得进程列表或想要的进程(枚举进程、遍历进程)

    一个常见的编程任务是枚举所有运行的"应用程序".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守护进程列表/守护进程

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

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

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

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

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

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

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

  9. edgedb 内部pg 数据存储的探索 (五) 运行进程列表信息

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

随机推荐

  1. 九度OJ题目1080:进制转换(java)使用BigInteger进行进制转换

    题目描述: 将M进制的数X转换为N进制的数输出. 输入: 输入的第一行包括两个整数:M和N(2<=M,N<=36). 下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成 ...

  2. java构造函数使用方法总结

    使用构造器时需要记住: 1.构造器必须与类同名(如果一个源文件中有多个类,那么构造器必须与公共类同名) 2.每个类可以有一个以上的构造器 3.构造器可以有0个.1个或1个以上的参数 4.构造器没有返回 ...

  3. SVN的安装及使用指南

    SVN的安装及使用指南 目录: 一.     SVN的安装. 1. VisualSVN的安装 2. Server Port的选择及错误处理 3. TortorieseSVN的安装 二.     SVN ...

  4. intellij idea打jar包时的注意事项

    intellij idea项目在打包maven项目时,数据路径很容易出现问题.在IDE内直接运行不会报错,但打成jar包运行就会报错. intellij打包的几种方式:http://www.cnblo ...

  5. Parallel.For 你可能忽视的一个非常实用的重载方法

    说起Parallel.For大家都不会陌生,很简单,不就是一个提供并行功能的for循环吗? 或许大家平时使用到的差不多就是其中最简单的那个重载方法,而真实情况 下Parallel.For里面有14个重 ...

  6. Oracle数据块损坏的恢复实例

    测试环境:11.2.0.4 1.构建数据块损坏的测试环境 2.有备份:常规恢复坏块 3.无备份:跳过坏块 1.构建数据块损坏的测试环境 1.1 创建测试表 --Create Table t_test ...

  7. 【Yii系列】Yii2.0基础框架

    缘起 因为一个月的短暂停留,我在给朋友搞事情,所以Yii系列的文章耽搁了很长时间,现在又重拾当时的知识,给大伙好好撸下这一系列的博客 提起Yii,虽然是国外的开发者搞的,但是它的作者是华人,这才是让我 ...

  8. MyBatis快速入门(一)

    一.MyBatis背景介绍 MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis使用简单的 ...

  9. 机器学习 - pycharm, pyspark, spark集成篇

    AS WE ALL KNOW,学机器学习的一般都是从python+sklearn开始学,适用于数据量不大的场景(这里就别计较“不大”具体指标是啥了,哈哈) 数据量大了,就需要用到其他技术了,如:spa ...

  10. MySQL自动化审核平台部署说明

    背景: 关于MySQL的审核的重要性就不说明了,本文的自动化审核是通过Inception和SQLAdvisor实现的,具体的使用可以看它们各自的说明文档.这里大致介绍下如何部署和使用它们,其实该文章也 ...