效果如图

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. Xamarin自定义布局系列——瀑布流布局

    Xamarin.Forms以Xamarin.Android和Xamarin.iOS等为基础,自己实现了一整套比较完整的UI框架,包含了绝大多数常用的控件,如下图 虽然XF(Xamarin.Forms简 ...

  2. Dollar Dayz poj3181

    http://poj.org/problem?id=3181 这个题目一开始就能看出来是个dp问题,但是我并没有一开始就看出来是一个完全背包为题,只是想着根据以前的方法,这个问题应该是可以找到规律的, ...

  3. 表达式计算 java 后缀表达式

    题目: 问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的值. 样例输入 1-2+3*(4-5) 样例 ...

  4. JavaWeb之JSP技术总结

    刚接触JSP技术的时候让我想起了在大学学的Asp+VBScript,记得当时我还用aspstudy做了一个小的新闻发布系统作为期末作品,也正是在那时候在卢哥卢老师的指导下走向编程的道路,对编程越来越感 ...

  5. SQL基本编程,分支语句,循环语句,存储过程,触发器

    基本编程: 定义变量 declare @变量名 数据类型 赋值 set @变量名 = 值 select @变量名 = 值 取值打印 select @变量名 print @变量名 映射到结果集 打印到消 ...

  6. 在线音乐播放器-----酷狗音乐api接口抓取

    首先身为一个在线音乐播放器,需要前端和数据库的搭配使用. 在数据库方面,我们没有办法制作,首先是版权问题,再加上数据量.所以我们需要借用其他网络播放器的数据库. 但是这些在线播放器,如百度,酷狗,酷我 ...

  7. JavaScript入门必备

    1.JavaScript和Java没有关系,JavaScript是一门(客服端)脚本语言,并且是一个解释性语言. 2.添加JavaScript的方法 (1)内联:通过<script>js代 ...

  8. centos6.7搭建DHCP服务器

    centos6.7搭建DHCP服务 2017-03-24 09:47:16 系统环境: centos6.7 安装之前首先使用rpm –qa | grep dhcp查看系统中是否已安装了dhcp软件包. ...

  9. 遍历Arraylist的方法

    package com.test; import java.util.ArrayList; import java.util.Iterator; import java.util.List; publ ...

  10. 一个请求中,ADF、JSF究竟做了哪些工作

    在Oracle ADF开发中,一个请求发生后,经过ADF处理后,我们可以很快得到响应页面,但在请求过程中ADF框架在背后究竟做了什么东西呢?今天让我们一起来了解下,ADF.JSF是基于组件模型的,不同 ...