通过进程名获取进程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; }