通过进程名获取进程ID

来源:https://blog.csdn.net/Bdyjy/article/details/53096891?utm_source=blogxgwz5

通过遍历系统中所有进程的进程名来获得目标进程的ID。

要遍历系统中所有的进程我们需要以下三个函数:
1、CreateToolhelp32Snapshot
函数原型:

HANDLE WINAPI CreateToolhelp32Snapshot(
  _In_ DWORD dwFlags,
  _In_ DWORD th32ProcessID
);

 

MSDN地址:https://msdn.microsoft.com/en-us/library/windows/desktop/ms682489(v=vs.85).aspx

这个函数的作用是:Takes a snapshot of the specified processes, as well as the heaps, modules, and threads used by these processes.即建立一个指定进程的快照。

参数:
dwFlags:快照的类型,我们这里选择TH32CS_SNAPPROCESS,表示所有进程。
th32ProcessID:要包括在快照中的进程ID,我们设为0,表示当前进程。

返回值:
成功返回快照句柄,失败返回INVALID_HANDLE_VALUE;

2、Process32First
函数原型:

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

 

MSDN地址:https://msdn.microsoft.com/en-us/library/windows/desktop/ms684834(v=vs.85).aspx

这个函数的作用是:取得快照中第一个进程信息。

参数:
hSnapshot:快照句柄
lppe:一个PROCESSENTRY32结构的指针,用来保存进程相关的信息,其中th32ProcessID成员保存着次进程的ID。

返回值:
成功返回true,失败返回false。

3、Process32Next
函数原型:

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

 

MSDN地址:https://msdn.microsoft.com/en-us/library/windows/desktop/ms684836(v=vs.85).aspx

这个函数的作用是:返回快照中下一个进程的信息。
参数:
hSnapshot:和上一个函数一样,也是快照句柄
lppe:也和上一个函数一样

返回值:
成功返回true,失败返回false

所以流程是先调用CreateToolhelp32Snapshot获取所有进程快照,再调用Process32First,然后不停调用Process32Next,直到Process32Next返回false,完成遍历。在每次调用Process32Next时比较此进程的进程名与目的进程名,相同则返回进程id退出循环。
代码如下:

#include <TlHelp32.h>       // 头文件

bool m_GetPIDByName(TCHAR * processName)
{
    // 创建系统快照
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hSnapshot == INVALID_HANDLE_VALUE)
    {
        return false;
    }

    PROCESSENTRY32 ps;
    ZeroMemory(&ps, sizeof(PROCESSENTRY32));
    ps.dwSize = sizeof(PROCESSENTRY32);
    if (!Process32First(hSnapshot, &ps))
    {
        return false;
    }
    do
    {
        if (lstrcmpi(ps.szExeFile, processName) == 0)
        {
            // 保存进程ID
            m_pID = ps.th32ProcessID;

            CloseHandle(hSnapshot);

            return true;
        }
    } while (Process32Next(hSnapshot, &ps));

    return false;
}
posted @ 2020-11-05 14:43  宇宙之外  阅读(1872)  评论(0编辑  收藏  举报