转载-VC遍历进程
时间:2021-09-04
本文章向大家介绍转载-VC遍历进程,主要包括转载-VC遍历进程使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
遍历进程需要几个API,和一个结构体 1.创建进程快照 2.遍历首次进程 3.继续下次遍历 4.进程信息结构体 API 分别是: 1.创建进程快照 HANDLE WINAPI CreateToolhelp32Snapshot( 进程快照API DWORD dwFlags, 遍历的标志,表示你要遍历什么(进程,模块,堆...) DWORD th32ProcessID 遍历的进程ID,如果为0,则是当前进程,如果不为0,则是创建指定进程的快照进行遍历 ); 注意,创建进程快照需要包含头文件 Tlhelp32.h 返回值: 成功返回快照句柄 失败返回 INVALID_HANDLE_VALUE 2.遍历首次进程. BOOL WINAPI Process32First( HANDLE hSnapshot, 进程快照句柄 LPPROCESSENTRY32 lppe 传入进程信息结构体,系统帮你填写. ); 进程信息结构体 复制代码 typedef struct tagPROCESSENTRY32 { DWORD dwSize; 进程信息结构体大小,首次调用之前必须初始化 DWORD cntUsage; 引用进程的次数,引用次数为0时,则进程结束 DWORD th32ProcessID; 进程的ID ULONG_PTR th32DefaultHeapID; 进程默认堆的标识符,除工具使用对我们没用 DWORD th32ModuleID; 进程模块的标识符 DWORD cntThreads; 进程启动的执行线程数 DWORD th32ParentProcessID; 父进程ID LONG pcPriClassBase; 进程线程的基本优先级 DWORD dwFlags; 保留 TCHAR szExeFile[MAX_PATH]; 进程的路径 } PROCESSENTRY32; typedef PROCESSENTRY32 *PPROCESSENTRY32; 复制代码 对我们有用的就是 dwSize 初始化结构体的大小 th32ProcessId 进程ID szExeFile[MAX_PATH] 进程路径 3.遍历下一次进程 BOOL WINAPI Process32Next( HANDLE hSnapshot, 进程句柄 LPPROCESSENTRY32 lppe 进程信息结构体 ); 兼容代码 复制代码 #include <windows.h> #include <Tlhelp32.h> int main(int argc, char* argv[]) { HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); if (INVALID_HANDLE_VALUE == hSnapshot) { return 0; } PROCESSENTRY32 pi; pi.dwSize = sizeof(PROCESSENTRY32); //第一次使用必须初始化成员 BOOL bRet = Process32First(hSnapshot,&pi); while (bRet) { /* 循环遍历添加自己的额外代码 */ bRet = Process32Next(hSnapshot,&pi); } return 0; } 复制代码 自己写的测试输出代码. 复制代码 #include <stdio.h> #include <windows.h> #include <Tlhelp32.h> int main(int argc, char* argv[]) { HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); if (INVALID_HANDLE_VALUE == hSnapshot) { return 0; } PROCESSENTRY32 pi; pi.dwSize = sizeof(PROCESSENTRY32); //第一次使用必须初始化成员 BOOL bRet = Process32First(hSnapshot,&pi); while (bRet) { /* 循环遍历添加自己的额外代码 */ printf("进程ID = %d ,进程路径 = %s\r\n",pi.th32ProcessID,pi.szExeFile); bRet = Process32Next(hSnapshot,&pi); } return 0; } 复制代码 输出内容 常用代码之根据进程名返回对应PID DWORD PsGetProcessIdByProcessName(LPTSTR ProcessName) { #ifdef UNICODE std::wstring ChekName; std::wstring tempChekName; #else std::string ChekName; std::string tempChekName; #endif tempChekName = ProcessName; HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (INVALID_HANDLE_VALUE == hSnapshot) { return FALSE; } PROCESSENTRY32 pi; pi.dwSize = sizeof(PROCESSENTRY32); //第一次使用必须初始化成员 BOOL bRet = Process32First(hSnapshot, &pi); transform(tempChekName.begin(), tempChekName.end(), tempChekName.begin(), ::tolower); while (bRet) { ChekName = pi.szExeFile; transform(ChekName.begin(), ChekName.end(), ChekName.begin(), ::tolower); //大写转小写进行配置 if (ChekName.find(tempChekName) != ChekName.npos) { //找到了 return pi.th32ProcessID; } bRet = Process32Next(hSnapshot, &pi); } return FALSE; } 常用代码之根据PID 返回进程名 #ifdef UNICODE std::wstring PsGetProcessNameByProcessId(DWORD pid) { HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (INVALID_HANDLE_VALUE == hSnapshot) { return FALSE; } PROCESSENTRY32 pi; pi.dwSize = sizeof(PROCESSENTRY32); //第一次使用必须初始化成员 BOOL bRet = Process32First(hSnapshot, &pi); while (bRet) { //大写转小写进行配置 if (pid == pi.th32ProcessID) { //找到了 return pi.szExeFile; } bRet = Process32Next(hSnapshot, &pi); } return FALSE; } #else std::string PsGetProcessNameByProcessId(DWORD pid) { HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (INVALID_HANDLE_VALUE == hSnapshot) { return FALSE; } PROCESSENTRY32 pi; pi.dwSize = sizeof(PROCESSENTRY32); //第一次使用必须初始化成员 BOOL bRet = Process32First(hSnapshot, &pi); while (bRet) { //大写转小写进行配置 if (pid == pi.th32ProcessID) { //找到了 return pi.szExeFile; } bRet = Process32Next(hSnapshot, &pi); } return FALSE; } #endif 根据进程PID杀掉进程 BOOL PsKillProcess(LPTSTR KillProcessName) { //杀掉进程 /* 杀掉进程方式很多种 1.TerminateProcess 2.循环遍历线程,结束线程 3.遍历内存.设置内存可读属性为 不可访问.让其异常自己推出 4.调用NT函数ZwUnmapViewOfSection 取消它的映射 5.内核 中内存清零法 强杀进程 .... 思路很多.可以搞的地方也很多. */ DWORD dwPid = PsGetProcessIdByProcessName(KillProcessName); HANDLE hProcess = NULL; if (dwPid != 0) { hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid); if (hProcess != NULL) { TerminateProcess(hProcess,0); } } return 0; }
原文地址:https://www.cnblogs.com/admrty/p/15225820.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 用缓冲字节流,复制一个照片
- 09小结:封装结果集或实体类时,有多个对象的解决方法
- 序列化与反序列化Serializable,Externalizable
- response.getWriter().write()和 response.getWriter().print()的区别:
- java使用TCP,由客户端向服务端传输图片,(电脑与电脑)或(同一台电脑)
- 使用druid
- UDP实现多人聊天室
- 请求(doFilter)与响应乱码(BaseController+自定义注解@ContentType(““))集中处理
- 反射:Reflect(获取类对象三种方法)
- getParameterMap()返回参数需要对应实体类类型,否则收不到----打卡
- 类对象 与 类的对象
- Lambda什么时候使用+简化匿名内部类
- PreparedStatement连接数据库实现登录验证,避免sql注入问题
- 自己封装数据库工具类
- Git---->Linux常用命令+主干、分支合并,发生冲突+当紧急任务来时,文件暂存+忽略文件不提交