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++实现)的更多相关文章

  1. Windows编程之模块遍历(C++实现)

    Windows编程之模块遍历 PS: 主要扣代码使用,直接滑动到最下面使用. 遍历模块需要几个API,和一个结构体 1.创建进程快照 2.遍历首次模块 3.继续下次遍历 4.模块信息结构体 API 分 ...

  2. windows编程 进程的创建销毁和分析

    Windows程序设计:进程 进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动,在Windows编程环境下,主要由两大元素组成: • 一个是操作系统用来管理进程的内核对象.操作系统使用内 ...

  3. 操作系统,windows编程,网络,socket

    首发:个人博客,更新&纠错&回复 之前关于c/s的一篇博文只记了思路没记代码,而且表达不清晰,事后看不知所云,这个习惯要改. 这十几天学了点关于操作系统.windows编程和网络,主要 ...

  4. 【转】浅析Windows编程的剪贴板

    摘要: 本文对Windows剪贴板机制作了深入.全面的阐述,具体内容包括:文本.位图.DSP.自定义格式剪贴板的使用和多数据项和延迟提交技术. 关键词: VC++6.0: 剪贴板机制:数据格式:延迟提 ...

  5. 《Windows编程零基础学》第零节

    首先很开心申请到了这一个专栏<Windows编程零基础学> 这是第一篇文章,在这里,我将讲述一些基础的知识. 什么是Windows编程 所谓Windows编程就是在Windows平台上开发 ...

  6. powershell脚本之windows服务与进程

    powershell脚本之windows服务与进程 服务与进程的区别: Windows服务是指系统自动完成的,不需要和用户交互的过程,可长时间运行的可执行应用程序 进程是程序运行的实例,系统会给运行中 ...

  7. Windows编程的本质

    既然Windows API编程是与Windows操作系统进行交互,所以就必须对Windows操作系统如何运行应用程序的原理搞清楚. 1.保护模式 操作系统是依附于cpu硬件的,所以操作系统所具备的功能 ...

  8. MoreWindows 微软认证专家博客目录(白话算法,C++ STL,windows编程)

    为了方便大家查找和学习,现将本人博客中所有博客文章列出目录. (http://blog.csdn.net/morewindows) 一.      白话经典算法 目前有17篇,分为七大排序和经典面试题 ...

  9. windows编程经典书籍

    本人是刚刚开始学习windows编程的,感觉看雪学院的大牛很NB.想找一些书籍来看学习学习,可是不知道看哪些书好.驱动,对菜鸟们来说真是一个很深奥的话题,所以 ,我找来了这篇文章供大家分享,以后大家发 ...

随机推荐

  1. 操作系统学习笔记----进程/线程模型----Coursera课程笔记

    操作系统学习笔记----进程/线程模型----Coursera课程笔记 进程/线程模型 0. 概述 0.1 进程模型 多道程序设计 进程的概念.进程控制块 进程状态及转换.进程队列 进程控制----进 ...

  2. react入门到进阶(一)

    一.何为react Facebook在F8会议上首次提出这个概念,一套全新的框架就此诞生. React 不是一个完整的 MVC.MVVM 框架,其只负责 View 层 React 跟 Web Comp ...

  3. Less命名空间

    Less命名空间 当我们拥有了大量选择器的时候,特别是团队协同开发时,如何保证选择器之间重名问题?如果你是 java 程序员或 C++ 程序员,我猜你肯定会想到命名空间 Namespaces. Les ...

  4. Mybatis(四)关联映射

    一. Mybatis关联映射 1 讲数据库中关联关系,主键表与外键表 一对多,多对一,主键表表示一 与外键表表示多 学生与学校的关系,工人与工厂,人员与部门的关系,.... 多        一    ...

  5. td-agent 收集日志到kafka的配置

    <source> @type tail path /data1/td-agent/wechat-tag*.log tag wechat-tag read_from_head true fo ...

  6. P1040 加分二叉树

    转自:(http://www.cnblogs.com/geek-007/p/7197439.html) 经典例题:加分二叉树(Luogu 1040) 设一个 n 个节点的二叉树 tree 的中序遍历为 ...

  7. PAT 1008. Elevator (20)

    1008. Elevator (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue The highest ...

  8. PHP 算法

    1.首先来画个菱形玩玩,很多人学C时在书上都画过,咱们用PHP画下,画了一半. 思路:多少行for一次,然后在里面空格和星号for一次. ? 1 2 3 4 5 6 <?php for($i=0 ...

  9. 前端测试框架Jest系列教程 -- Mock Functions

    写在前面: 在写单元测试的时候有一个最重要的步骤就是Mock,我们通常会根据接口来Mock接口的实现,比如你要测试某个class中的某个方法,而这个方法又依赖了外部的一些接口的实现,从单元测试的角度来 ...

  10. sendGrid 纯文本的换行问题

    项目中使用sendGrid发送邮件,并且要求纯文本格式,遇到了无法换行的问题(使用\r\n). 解决方案: 1. 在换行符前加空格(官方推荐的做法 https://sendgrid.com/docs/ ...