效果如图

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. node.js异步控制流程 回调,事件,promise和async/await

    写这个问题是因为最近看到一些初学者用回调用的不亦乐乎,最后代码左调来又调去很不直观. 首先上结论:推荐使用async/await或者co/yield,其次是promise,再次是事件,回调不要使用. ...

  2. 1639: [Usaco2007 Mar]Monthly Expense 月度开支

    1639: [Usaco2007 Mar]Monthly Expense 月度开支 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 593  Solved: ...

  3. 本地化 NSLocal

    本地化封装了关于语言,文化以及技术约定和规范的信息.用于提供于用户所处地域相关的定制化信息和首选项信息的设置.通过获取用户的本地化信息设置,我们可以为用户提供更加友好人性化的界面设置,包括更改更改应用 ...

  4. Java反射机制深度剖析

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! Java反射机制是Java语言中一种很重要的机制,可能在工作中用到的机会不多,但是在很多框架中都有用到这种机制.我们知道Java是一门静态 ...

  5. querySlector

    在传统的 JavaScript 开发中,查找 DOM 往往是开发人员遇到的第一个头疼的问题,原生的 JavaScript 所提供的 DOM 选择方法并不多,仅仅局限于通过 tag, name, id ...

  6. css3渐变生成器网页

    http://westciv.com/tools/gradients/ http://www.colorzilla.com/gradient-editor/

  7. unity3d 中文乱码解决方法——cs代码文件格式批量转化UTF8

    在Unity3d中经常会碰到中文乱码的问题,比如代码中的[AddComponentMenu("GameDef/AI/战机AI")],注释,中文文本等等 其原因在于,unity本身是 ...

  8. 开源的.NET媒体文件操作组件TagLib#解析

    人生得意须尽欢 莫使金樽空对月.写博客都会在吃饭后,每次吃饭都要喝上二两小酒,写博客前都要闲扯,这些都是个人爱好,改不掉了,看不惯的人,还望多多包含一下,有相同爱好的同学,咱们可以一起喝着小酒一边吹牛 ...

  9. Xshell连接本地 Virtualbo Ubuntu

    1.打开Virtualbox软件,启动ubuntu虚拟机. Ctrl + Alt + T 打开终端输入一下命令: sudo apt-get update 然后安装ssh 输入:sudo apt-get ...

  10. 深度学习实践系列(2)- 搭建notMNIST的深度神经网络

    如果你希望系统性的了解神经网络,请参考零基础入门深度学习系列,下面我会粗略的介绍一下本文中实现神经网络需要了解的知识. 什么是深度神经网络? 神经网络包含三层:输入层(X).隐藏层和输出层:f(x) ...