根据进程名获取进程ID
2021-08-30
362
0
打开设备管理器,会看到系统当前所有运行的进程,运行时信息包括进程名,进程ID等。
设备管理器默认不显示进程名,可点击 查看>>选择名>>进程ID
但假如已知运行了一个进程,想通过编程的方法来获取进程ID,请看下列代码
#include<windows.h>
#include <TlHelp32.h>
ULONG GetProcessIdByName(TCHAR* pName)
{
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(pe32);// 在使用这个结构之前,先设置它的大小
// 给系统内的所有进程拍一个快照
HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == INVALID_HANDLE_VALUE)
{
MessageBox(L"CreateToolhelp32Snapshot调用失败");
return 0;
}
// 遍历进程快照,轮流显示每个进程的信息
BOOL bMore = ::Process32First(hProcessSnap, &pe32);
CString e = pName;
while (bMore)
{
//可能存在多个同名的进程
//这里只获取第一个进程
if (e == pe32.szExeFile)
{
return pe32.th32ProcessID;
}
bMore = ::Process32Next(hProcessSnap, &pe32);
}
// 不要忘记清除掉snapshot对象
::CloseHandle(hProcessSnap);
return 0;
}
PROCESSENTRY32是一个进程基本信息结构,可获取地信息比较多,但一般有用的也就进程ID和进程名。
typedef struct tagPROCESSENTRY32
{
DWORD dwSize;
DWORD cntUsage;
DWORD th32ProcessID; // this process
ULONG_PTR th32DefaultHeapID;
DWORD th32ModuleID; // associated exe
DWORD cntThreads;
DWORD th32ParentProcessID; // this process's parent process
LONG pcPriClassBase; // Base priority of process's threads
DWORD dwFlags;
CHAR szExeFile[MAX_PATH]; // Path
} PROCESSENTRY32;
typedef PROCESSENTRY32 * PPROCESSENTRY32;
typedef PROCESSENTRY32 * LPPROCESSENTRY32;