C++实现结束应用进程小工具(windows)
说明:
在电脑上一些软件或系统有时可能会将程序偷偷运行在后台,占用计算机资源的情况。一般我们通过可以找到程序文件所在位置,禁止程序启动的方法解决这个问题,但也可以通过从任务管理器直接结束进程方法做到。从而减少无用程序对计算机资源的占用。
该程序可以自动检查设定进程名称的进程是否正在运行,如果是则结束该进程,从而免去手动关闭的步骤。
使用步骤为在该程序exe文件目录下names.txt文件中(可改变)将需要结束的进程名写在文件中,多个进程名以换行分割,然后点击exe程序执行。
思路:
封装获取系统进程名称、id、结束系统进程方法。从文件中获取需要结束进程的名称,根据名称结束进程。
编译环境:
Windows VS2017
代码需要在支持C++11标准的编译器下编译
代码:
#include <iostream> #include <windows.h> #include <tlhelp32.h> #include <vector> #include <fstream> #include <map> using namespace std; // 需要关闭进程名字所在文件路径 #define CLOSE_FILE_PATH "names.txt" // 每CHECK_INTERVAL时间(毫秒)后检查并结束一次进程 #define CHECK_INTERVAL 3000 class Controller { private: // 进程信息结构体,包含进程id和进程名 struct PInfo { long pId; wchar_t *pName; PInfo(long pId, wchar_t *pName) : pId(pId), pName(pName) {} }; // 根据pid关闭进程 static int closeProcess(unsigned long pid) { HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pid); if (hProcess) { TerminateProcess(hProcess, -1); } return 0; } // 获取所有进程信息 static map<wstring, long> getProcessInfo() { HANDLE hProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); PROCESSENTRY32 currentProcess; currentProcess.dwSize = sizeof(currentProcess); map<wstring, long> pInfosMap = map<wstring, long>(); Process32First(hProcess, ¤tProcess); wchar_t *pNameStr; bool flag = true; while (flag) { pNameStr = new WCHAR[MAX_PATH]; // wcscpy(pNameStr, currentProcess.szExeFile); wcscpy_s(pNameStr, wcslen(currentProcess.szExeFile) + 1, currentProcess.szExeFile); pInfosMap.insert(pair<wstring, long>(pNameStr, currentProcess.th32ProcessID)); flag = Process32Next(hProcess, ¤tProcess); } return pInfosMap; } // char*转wchar* static wchar_t * charToWchar(const char* cchar) { wchar_t *m_wchar; int len = MultiByteToWideChar(CP_ACP, 0, cchar, strlen(cchar), NULL, 0); m_wchar = new wchar_t[len + 1]; MultiByteToWideChar(CP_ACP, 0, cchar, strlen(cchar), m_wchar, len); m_wchar[len] = '\0'; return m_wchar; } // 循环获取需要关闭的进程名 template <typename Callback> static void forClosePName(Callback callback) { ifstream examplefile(CLOSE_FILE_PATH); if (!examplefile.is_open()) { cout << "Error opening file"; exit(1); } char buffer[260]; while (!examplefile.eof()) { examplefile.getline(buffer, 260); callback(buffer); } } // 将需要关闭的进程名保存到vector<wchar_t*>中返回 vector<wchar_t*> getClosePName() { vector<wchar_t*> closePNames = vector<wchar_t*>(); forClosePName([&](auto pName) { closePNames.push_back(charToWchar(pName)); }); return closePNames; } public: Controller() { // 需要结束的进程名 vector<wchar_t*> closePNames = getClosePName(); // 所有进程信息map map<wstring, long> processMap; while (true) { processMap = getProcessInfo(); for (auto pName : closePNames) { //printf("%ls \n", pName); long closePId = processMap[pName]; if (closePId == 0 || wstring(pName) == L"系统空闲进程") continue; closeProcess(closePId); } Sleep(CHECK_INTERVAL); } } }; int main() { Controller(); return 0; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。