#include "TlHelp32.h"
void CKillProcessDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
//OnOK();
UpdateData(TRUE);
CString str;
str.Format(TEXT("确定要杀死进程:%s?"),m_ProcessName.GetBuffer());
//kill进程from名字
//创建进程快照(TH32CS_SNAPPROCESS表示创建所有进程的快照)
HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
//PROCESSENTRY32进程快照的结构体
PROCESSENTRY32 pe;
//实例化后使用Process32First获取第一个快照的进程前必做的初始化操作
pe.dwSize = sizeof(PROCESSENTRY32);
//下面的IF效果同:
//if(hProcessSnap == INVALID_HANDLE_VALUE) 无效的句柄
if(!Process32First(hSnapShot,&pe))
{
return ;
}
//将字符串转换为小写
m_ProcessName.MakeLower();
//如果句柄有效 则一直获取下一个句柄循环下去
while (Process32Next(hSnapShot,&pe))
{
//pe.szExeFile获取当前进程的可执行文件名称
CString scTmp = pe.szExeFile;
//将可执行文件名称所有英文字母修改为小写
scTmp.MakeLower();
//比较当前进程的可执行文件名称和传递进来的文件名称是否相同
//相同的话Compare返回0
if(!scTmp.Compare(m_ProcessName))
{
if(MessageBox(
str,
TEXT("Are you sure ?"),
MB_YESNO) != IDYES)
{
return;
}
//从快照进程中获取该进程的PID(即任务管理器中的PID)
DWORD dwProcessID = pe.th32ProcessID;
//OpenProcess 函数用来打开一个已存在的进程对象,并返回进程的句柄。
HANDLE hProcess = ::OpenProcess(PROCESS_TERMINATE,FALSE,dwProcessID);
::TerminateProcess(hProcess,0); //杀死进程
CloseHandle(hProcess);
return;
}
scTmp.ReleaseBuffer();
}
m_ProcessName.ReleaseBuffer();
}