Windows编程之进程遍历(C++实现)
Windows编程之进程遍历
PS: 主要扣代码使用,直接滑动到最下面使用.
遍历进程需要几个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,);
if (INVALID_HANDLE_VALUE == hSnapshot)
{
return ;
}
PROCESSENTRY32 pi;
pi.dwSize = sizeof(PROCESSENTRY32); //第一次使用必须初始化成员
BOOL bRet = Process32First(hSnapshot,&pi);
while (bRet)
{
/*
循环遍历添加自己的额外代码
*/
bRet = Process32Next(hSnapshot,&pi);
}
return ;
}
自己写的测试输出代码.
#include <stdio.h>
#include <windows.h>
#include <Tlhelp32.h>
int main(int argc, char* argv[])
{
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,);
if (INVALID_HANDLE_VALUE == hSnapshot)
{
return ;
}
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 ;
}
输出内容

常用代码之根据进程名返回对应PID
DWORD PsLookupProcessIdByProcessName(string CompareFile)
{ HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, );
if (INVALID_HANDLE_VALUE == hSnapshot)
{
return ;
}
PROCESSENTRY32 pi;
pi.dwSize = sizeof(PROCESSENTRY32); //第一次使用必须初始化成员
BOOL bRet = Process32First(hSnapshot, &pi);
while (bRet)
{
string TempFile = pi.szExeFile;
if (TempFile.find(CompareFile) != TempFile.npos)
{
return pi.th32ProcessID;
} bRet = Process32Next(hSnapshot, &pi);
}
return ;
}
常用代码之根据PID 返回进程名
string PsLookupProcessNameByProcessId(DWORD dwPid)
{ HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, );
if (INVALID_HANDLE_VALUE == hSnapshot)
{
return ;
}
PROCESSENTRY32 pi;
pi.dwSize = sizeof(PROCESSENTRY32); //第一次使用必须初始化成员
BOOL bRet = Process32First(hSnapshot, &pi);
while (bRet)
{ if (dwPid == pi.th32ProcessID)
{
return pi.szExeFile;
} bRet = Process32Next(hSnapshot, &pi);
}
return ;
}
Windows编程之进程遍历(C++实现)的更多相关文章
- Windows编程之模块遍历(C++实现)
Windows编程之模块遍历 PS: 主要扣代码使用,直接滑动到最下面使用. 遍历模块需要几个API,和一个结构体 1.创建进程快照 2.遍历首次模块 3.继续下次遍历 4.模块信息结构体 API 分 ...
- windows编程 进程的创建销毁和分析
Windows程序设计:进程 进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动,在Windows编程环境下,主要由两大元素组成: • 一个是操作系统用来管理进程的内核对象.操作系统使用内 ...
- 操作系统,windows编程,网络,socket
首发:个人博客,更新&纠错&回复 之前关于c/s的一篇博文只记了思路没记代码,而且表达不清晰,事后看不知所云,这个习惯要改. 这十几天学了点关于操作系统.windows编程和网络,主要 ...
- 【转】浅析Windows编程的剪贴板
摘要: 本文对Windows剪贴板机制作了深入.全面的阐述,具体内容包括:文本.位图.DSP.自定义格式剪贴板的使用和多数据项和延迟提交技术. 关键词: VC++6.0: 剪贴板机制:数据格式:延迟提 ...
- 《Windows编程零基础学》第零节
首先很开心申请到了这一个专栏<Windows编程零基础学> 这是第一篇文章,在这里,我将讲述一些基础的知识. 什么是Windows编程 所谓Windows编程就是在Windows平台上开发 ...
- powershell脚本之windows服务与进程
powershell脚本之windows服务与进程 服务与进程的区别: Windows服务是指系统自动完成的,不需要和用户交互的过程,可长时间运行的可执行应用程序 进程是程序运行的实例,系统会给运行中 ...
- Windows编程的本质
既然Windows API编程是与Windows操作系统进行交互,所以就必须对Windows操作系统如何运行应用程序的原理搞清楚. 1.保护模式 操作系统是依附于cpu硬件的,所以操作系统所具备的功能 ...
- MoreWindows 微软认证专家博客目录(白话算法,C++ STL,windows编程)
为了方便大家查找和学习,现将本人博客中所有博客文章列出目录. (http://blog.csdn.net/morewindows) 一. 白话经典算法 目前有17篇,分为七大排序和经典面试题 ...
- windows编程经典书籍
本人是刚刚开始学习windows编程的,感觉看雪学院的大牛很NB.想找一些书籍来看学习学习,可是不知道看哪些书好.驱动,对菜鸟们来说真是一个很深奥的话题,所以 ,我找来了这篇文章供大家分享,以后大家发 ...
随机推荐
- vue.js的学习中的简单案例
今天学习了近年来挺火的一门JS技术,叫vue.js下面是它的一个简单案例: <html> <head> <title>$Title$</title> / ...
- 纯Socket(BIO)长链接编程的常见的坑和填坑套路
本文章纯属个人经验总结,伪代码也是写文章的时候顺便白板编码的,可能有逻辑问题,请帮忙指正,谢谢. Internet(全球互联网)是无数台机器基于TCP/IP协议族相互通信产生的.TCP/IP协议族分了 ...
- webpack loader加载器
配置loader,通过加载器处理文件,例如css sass less等,告诉webpack每一种文件都需要使用什么来加载器来处理. 1.node.js安装好之后也会自动默认安装好npm,所以cmd c ...
- 【机器学习】RNN学习
感谢中国人民大学的胡鹤老师,课程容量巨大,收获颇丰. 之前提到的CNN模型主要用到人类的视觉中枢,但其有一劣势,无论是人类的视觉神经还是听觉神经,所接受到的都是一个连续的序列,使用CNN相当于割裂了前 ...
- Android数据绑定技术一,企业级开发
PS:数据绑定,顾名思义是数据与一些控件或者用户账号等绑定,这样用的好处是便于管理.代码清晰,量少. 首先要了解什么是数据绑定? 为什么要用数据绑定? 怎么用数据绑定? 语法的使用 简单例子,数据绑定 ...
- 使用questionsModel.values()后不能获取模型中的属性对应的外键属性值的解决方式
class QuestionsModel(models.Model): author = models.ForeignKey(FrontUserModel,null=True) content = m ...
- 设计模式(8) - 迭代器模式(iterator)- 实现ArrayList和linkedList的迭代器
上周六就開始写这篇博客,之后一直耽误了.到前天才開始写.今天醒的早,就把这部分整理一下. 本文内容參考易学设计模式和马士兵的迭代器模式的视频. 了解迭代器模式一个作用就是让你在使用 迭代器遍历集合类的 ...
- 《3》CentOS7.0+OpenStack+kvm云平台部署—配置Glance
感谢朋友支持本博客,欢迎共同探讨交流.因为能力和时间有限,错误之处在所难免,欢迎指正. 假设转载.请保留作者信息. 博客地址:http://blog.csdn.net/qq_21398167 原博文地 ...
- Error: Failed to launch instance "win7": Please try again later [Error: No valid host was found. ].
感谢朋友支持本博客,欢迎共同探讨交流.因为能力和时间有限,错误之处在所难免,欢迎指正! 假设转载,请保留作者信息. 博客地址:http://blog.csdn.net/qq_21398167 原博文地 ...
- HTTP请求中怎样选择Get和Post方式
在应用中最经常使用的Http请求无非是get和post,get请求能够获取静态页面,也能够把參数放在URL字串后面,传递给servlet.post与get的不同之处在于post的參数不是放在URL字串 ...