这里我利用工具帮助(Tool helper)这类API来实现根据进程名查找进程ID。Tool helper API由头文件TlHelp32.h定义。
我们实现这个功能需要用到的API有CreateToolhelp32Snapshot、Process32First、Process32Next。之外我们还需用
到的一个结构体是PROCESSENTRY32,这个结构体中保存了进程的相关信息,其中就有进程名和进程ID。我们可以
像上一篇通过文件句柄获得文件路径中那样,通过CreateToolhelp32Snapshot、Process32First、Process32Next来
遍历所有的进程,并用PROCESSENTRY32保存相关信息,通过匹配进程名来查找ID。
#include <windows.h> #include <stdio.h> #include <string.h> #include <TlHelp32.h> BOOL GetProcessIdByName(LPSTR szProcessname, LPDWORD lpPID) { PROCESSENTRY32 ps; HANDLE hSnapshot; ZeroMemory(&ps, sizeof(PROCESSENTRY32)); ps.dwSize = sizeof(PROCESSENTRY32); hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hSnapshot == INVALID_HANDLE_VALUE) { return FALSE; } if (!Process32First(hSnapshot, &ps)) { return FALSE; } do { if (lstrcmpi(ps.szExeFile, szProcessname) == 0) { *lpPID = ps.th32ProcessID; CloseHandle(hSnapshot); return TRUE; } } while (Process32Next(hSnapshot, &ps)); CloseHandle(hSnapshot); return FALSE; } int main() { TCHAR szProcessName[MAX_PATH]; DWORD dwPID; while (scanf("%s", szProcessName)) { GetProcessIdByName(szProcessName, &dwPID); printf("The id of the process %s is %d\n", szProcessName, dwPID); } return 0; }
当然,如果我们还想要获得进程句柄,只要调用OpenProcess即可。