快捷搜索: 王者荣耀 脱发

通过进程名获取进程ID

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

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

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

MSDN地址:

这个函数的作用是: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地址:

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

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

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

3、Process32Next 函数原型:

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

MSDN地址:

这个函数的作用是:返回快照中下一个进程的信息。 参数: 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;
}
经验分享 程序员 微信小程序 职场和发展