C# TreeGridView 实现进程列表
2016-01-31 22:44
417 查看
效果如图
0x01 获取进程列表,使用Win32Api规避"拒绝访问"异常
0x02 递归将列表转为树结构
0x03 递归树结构绑定到控件节点
群共享获取源码 .Net软件小组 283590657
0x01 获取进程列表,使用Win32Api规避"拒绝访问"异常
public List<AppProcess> GetAppProcesses() { IntPtr handle = NativeMethods.CreateToolhelp32Snapshot(0x2, 0); List<ProcessEntry32> list = new List<ProcessEntry32>(); List<AppProcess> applist = new List<AppProcess>(); if ((int)handle > 0) { ProcessEntry32 pe32 = new ProcessEntry32(); pe32.dwSize = (uint)Marshal.SizeOf(pe32); int bMore = NativeMethods.Process32First(handle, ref pe32); while (bMore == 1) { ProcessEntry32 pe = pe32.MarshalEx(); //排除掉[System Process] if (pe.th32ProcessID > 0) { 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(512); var len = NativeMethods.GetModuleFileNameEx(processHandle, IntPtr.Zero, winExePath, (uint)winExePath.Capacity); if (len > 0) { var path = winExePath.ToString(); var baseName = p.szExeFile; var description = ""; var manifuture = ""; try { var err = 0; var baseNameSb = new StringBuilder(128); var nameLen = NativeMethods.GetModuleBaseName(new SafeProcessHandle(processHandle, false), 0, baseNameSb, baseNameSb.Capacity); if (nameLen > 0) { baseName = baseNameSb.ToString(); } else { err = Marshal.GetLastWin32Error(); } PROCESS_BASIC_INFORMATION pbi = new PROCESS_BASIC_INFORMATION(); int sizeInfoReturned; int queryStatus = NativeMethods.NtQueryInformationProcess(processHandle, (PROCESSINFOCLASS)0, 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 > 0 ? 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 = 0; SetNodes(item.SubItems, node.Nodes); } }
群共享获取源码 .Net软件小组 283590657
相关文章推荐
- Visual Studio项目目录下的bin目录和 obj目录
- C#基础总结——装箱与拆箱
- 《C#之集训1-20121019c#基础》
- C#学习二之多态的实现
- 【C#】异常处理
- C#多线程编程实例 线程与窗体交互
- C#版三层登录
- C#中WinForm窗体的单例模式,避免窗体被实例化多次
- C# web 开发
- C#成神之路<2> 关于基本类对象的创建操作
- C#成神之路<1> 对面向对象编程的加深理解
- 结合Visual C#开发环境讲解C#中事件的订阅和取消订阅
- C#编程中枚举类型的使用教程
- 举例讲解C#编程中委托的实例化使用
- 三层登录—c#
- C#中的delegate委托类型基本学习教程
- C# 读取XML
- 解析C#中的分部类和分部方法
- 深入讲解C#编程中嵌套类型和匿名类型的定义与使用
- 详解C#中使用对象或集合的初始值设定项初始化的操作