使用进程名获取进程id和进程句柄

本文内容为编写一个任务管理器所需要的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<Windows.h>
#include<iostream>
#include<TlHelp32.h>
#include<vector>
using namespace std;
vector<DWORD> GetProcessIDByName(LPCTSTR szProcessName)
{
    STARTUPINFO st;
    PROCESS_INFORMATION pi;
    PROCESSENTRY32 ps;
    HANDLE hSnapshot;
    vector<DWORD> 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,下载完整的代码。任何疑问欢迎咨询。
github地址

相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页