进程的遍历、获取与销毁
创建快照遍历
//获得进程所使用的堆,模块和线程的信息快照
HANDLE WINAPI CreateToolhelp32Snapshot
(
DWORD dwFlags,//标志位
DWORD th32ProcessID //进程ID
)
//dwFlags: 指定的快照中,指定需要拍的系统部分
TH32CS_INHERIT 声明快照句柄是可继承的。
TH32CS_SNAPALL 在快照中包含系统中所有的 进程和线程。
TH32CS_SNAPHEAPLIST 在快照中包含ID所指定的进程的所有的堆。
TH32CS_SNAPMODULE 在快照中包含在ID所指定的进程的所有的模块。
TH32CS_SNAPPROCESS 在快照中包含系统中所有的进程。
TH32CS_SNAPTHREAD 在快照中包含系统中所有的线程。
BOOL WINAPI Process32First(
HANDLE hSnapshot, //快照句柄
LPPROCESSENTRY32 lppe //获得的信息
);获得快照中的第一个成员的信息
BOOL WINAPI Process32Next(
HANDLE hSnapshot, //快照句柄
LPPROCESSENTRY32 lppe //获得的信息
);获得快照中后一个成员的信息
函数实现
DWORD find_processid_by_nameW(PWCHAR process_name)
{
HANDLE hand = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
if ((int)hand == -1)
{
return GetLastError();
}
PROCESSENTRY32 process_info = { 0 };
process_info.dwSize = sizeof PROCESSENTRY32;
if (!Process32First(hand, &process_info))
{
return GetLastError();
}
do
{
if (!wcscmp(process_info.szExeFile, process_name))
{
return process_info.th32ProcessID;
}
} while (Process32Next(hand,&process_info));
return 0;
}
进程的获取与销毁
//进程的获取
HANDLE OpenProcess(
DWORD dwDesiredAccess, // 访问权限标识
BOOL bInheritHandle, // 获取的句柄能否被继承
DWORD dwProcessId // 目标进程的标识符
);
//退出
VOID ExitProcess(
UINT uExitCode // 退出代码 (谁调用谁结束)
);
BOOL TerminateProcess(
HANDLE hProcess, // 关闭进程的句柄
UINT uExitCode // 进程的退出代码
);
exp:
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
if (hProcess)
{
MessageBox(NULL, process_name, L"打开进程了!", MB_OK);
TerminateProcess(hProcess, 0);
}