C++實現結束應用進程小工具
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; }
以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。
推薦閱讀:
- 在C#程序中註入惡意DLL的方法詳解
- C++實現字符格式相互轉換的示例代碼
- C語言 TerminateProcess函數案例詳解
- C/C++寬窄字符轉換與輸出的多種實現方法
- c++下使用windows api遍歷指定文件夾及其子文件夾中的文件