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