使用进程名获取进程id和进程句柄
发布日期:2021-10-07 04:43:12 浏览次数:21 分类:技术文章

本文共 2394 字,大约阅读时间需要 7 分钟。

本文内容为编写一个任务管理器所需要的API介绍以及如何通过进程名称获取进程id的方法,函数使用频率高,所以贴出来以便复用。

相关api介绍

CreateToolhelp32Snapshot

函数功能为拍摄当前所有进程的快照,函数原型如下:

HANDLE WINAPI CreateToolhelp32Snapshot(  _In_ DWORD dwFlags,//用来指定“快照”中需要返回的对象,可以是TH32CS_SNAPPROCESS等  _In_ DWORD th32ProcessID//一个进程ID号,用来指定要获取哪一个进程的快照,当获取系统进程列表或获取 当前进程快照时可以设为0);

具体参数列表含义如下:

dwFlags:指定快照中包含的系统内容,这个参数能够使用下列数值(常量)中的一个或多个。

  • TH32CS_INHERIT - 声明快照句柄是可继承的。
  • TH32CS_SNAPALL - 在快照中包含系统中所有的进程和线程。
  • TH32CS_SNAPHEAPLIST - 在快照中包含在th32ProcessID中指定的进程的所有的堆。
  • TH32CS_SNAPMODULE - 在快照中包含在th32ProcessID中指定的进程的所有的模块。
  • TH32CS_SNAPPROCESS - 在快照中包含系统中所有的进程。
  • TH32CS_SNAPTHREAD - 在快照中包含系统中所有的线程。
  • Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD | - TH32CS_SNAPMODULE)

th32ProcessID:指定将要快照的进程ID。如果该参数为0表示快照当前进程。该参数只有在设置了TH32CS_SNAPHEAPLIST或者TH32CS_SNAPMODULE后才有效,在其他情况下该参数被忽略,所有的进程都会被快照。

Process32First

process32First是一个进程获取函数,当我们利用函数CreateToolhelp32Snapshot()获得当前运行进程的快照后,我们可以利用process32First函数来获得第一个进程的句柄。函数原型如下:

BOOL WINAPI Process32First(  _In_    HANDLE           hSnapshot,  _Inout_ LPPROCESSENTRY32 lppe);

hSnapshot:使用CreateToolhelp32Snapshot获取到的快照句柄。

lppe:PROCESSENTRY32 结构指针,用于存储进程的信息。
当没有第一个进程时返回false,否则返回true.

Process32Next

拍摄快照后获取当前进程的下一个进程的信息。函数原型如下:

BOOL WINAPI Process32Next(  _In_  HANDLE           hSnapshot,  _Out_ LPPROCESSENTRY32 lppe);

hSnapshot:使用CreateToolhelp32Snapshot获取到的快照句柄。

lppe:指向当前的进程信息结构的指针,调用后返回下一个函数的信息结构体。
当遍历结束时返回false,否则返回true.

利用进程名获取进程id代码实现

#include
#include
#include
#include
using namespace std;vector
GetProcessIDByName(LPCTSTR szProcessName){ STARTUPINFO st; PROCESS_INFORMATION pi; PROCESSENTRY32 ps; HANDLE hSnapshot; vector
dwPID; ZeroMemory(&st, sizeof(STARTUPINFO)); ZeroMemory(&pi, sizeof(PROCESS_INFORMATION)); st.cb = sizeof(STARTUPINFO); ZeroMemory(&ps, sizeof(PROCESSENTRY32)); ps.dwSize = sizeof(PROCESSENTRY32); hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);//拍摄进程快照 if (hSnapshot == INVALID_HANDLE_VALUE)//快照拍摄失败 { return dwPID; } if (!Process32First(hSnapshot, &ps)) { return dwPID; } do { if (lstrcmpi(ps.szExeFile, szProcessName) == 0)//遍历进程快照,比较进程名 { dwPID.push_back(ps.th32ProcessID);//将进程id放到容器中 } } while (Process32Next(hSnapshot, &ps)); // 没有找到 CloseHandle(hSnapshot); return dwPID;//返回容器}

函数使用方法,函数输入为要查找的进程的名字,返回结果为所有进程名字符合要求的进程列表。

欢迎访问我的github,下载完整的代码。任何疑问欢迎咨询。

转载地址:https://blog.csdn.net/meanong/article/details/80201045 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:上取整除法的实现
下一篇:c++ 对vector中元素进行排序,查找,返回下标的方法

发表评论

最新留言

不错!
[***.144.177.141]2024年03月29日 07时21分25秒