#ifndef CLOSE_PROCESS_HPP #define CLOSE_PROCESS_HPP /* * 杀掉所有名字等于指定的名称的进程。 */ #include #include #include #include char* Wchar2Char(const wchar_t* wp) { int len = WideCharToMultiByte(CP_ACP, 0, wp, wcslen(wp), NULL, 0, NULL, NULL); char* m_char = new char[len + 1]; WideCharToMultiByte(CP_ACP, 0, wp, wcslen(wp), m_char, len, NULL, NULL); m_char[len] = '\0'; return m_char; } BOOL KillProcessFromName(std::string strProcessName) { //创建进程快照(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 FALSE; } //将字符串转换为小写 std::transform(strProcessName.begin(), strProcessName.end(), strProcessName.begin(), ::tolower); //如果句柄有效 则一直获取下一个句柄循环下去 while (Process32Next(hSnapShot, &pe)) { char* pszTem = Wchar2Char(pe.szExeFile); //pe.szExeFile获取当前进程的可执行文件名称 std::string scTmp = std::string(pszTem); delete[] pszTem; //将可执行文件名称所有英文字母修改为小写 std::transform(scTmp.begin(), scTmp.end(), scTmp.begin(), ::tolower); //scTmp.MakeLower(); //比较当前进程的可执行文件名称和传递进来的文件名称是否相同 //相同的话Compare返回0 if (scTmp == strProcessName) { //从快照进程中获取该进程的PID(即任务管理器中的PID) DWORD dwProcessID = pe.th32ProcessID; HANDLE hProcess = ::OpenProcess(PROCESS_TERMINATE, FALSE, dwProcessID); ::TerminateProcess(hProcess, 0); CloseHandle(hProcess); return TRUE; } //scTmp.ReleaseBuffer(); } //strProcessName.ReleaseBuffer(); return FALSE; } #endif