C ++监视后台运行进程?

我一直在试图用C ++编写一个程序来监视正在运行的进程,并在检测到正在运行的时候终止某个程序。 我已经写了一个程序,但是我唯一能想到的方法是使用一个无限的WHILE循环来检查程序。 正如你所能想象的那样,这一直使用CPU的能力和资源来不断循环。 在任务pipe理器中,您可以看到大多数正在运行的进程始终使用CPU的0%。 我的问题是:如何编写或修改这个程序在后台运行,利用0%的CPU,直到检测到它应该终止的进程? 我的整个计划在下面。 在这个例子中,我使用WinMain中的“Notepad.exe”作为程序应该终止的进程。

 #include <Windows.h> #include <iostream> #include <tlhelp32.h> #include <string> #define TA_FAILED 0 #define TA_SUCCESS_CLEAN 1 #define TA_SUCCESS_KILL 2 DWORD WINAPI TerminateApp(DWORD dwPID, DWORD dwTimeout); DWORD WINAPI Terminate16App(DWORD dwPID, DWORD dwThread, WORD w16Task, DWORD dwTimeout); typedef struct { DWORD dwID; DWORD dwThread; } TERMINFO; BOOL CALLBACK TerminateAppEnum( HWND hwnd, LPARAM lParam ) ; DWORD WINAPI TerminateApp( DWORD dwPID, DWORD dwTimeout ) { HANDLE hProc ; DWORD dwRet ; // If we can't open the process with PROCESS_TERMINATE rights, // then we give up immediately. hProc = OpenProcess(SYNCHRONIZE|PROCESS_TERMINATE, FALSE, dwPID); if(hProc == NULL) { return TA_FAILED ; } // TerminateAppEnum() posts WM_CLOSE to all windows whose PID // matches your process's. EnumWindows((WNDENUMPROC)TerminateAppEnum, (LPARAM) dwPID) ; // Wait on the handle. If it signals, great. If it times out, // then you kill it. if(WaitForSingleObject(hProc, dwTimeout)!=WAIT_OBJECT_0) dwRet=(TerminateProcess(hProc,0)?TA_SUCCESS_KILL:TA_FAILED); else dwRet = TA_SUCCESS_CLEAN ; CloseHandle(hProc) ; return dwRet ; } BOOL CALLBACK TerminateAppEnum( HWND hwnd, LPARAM lParam ) { DWORD dwID ; GetWindowThreadProcessId(hwnd, &dwID) ; if(dwID == (DWORD)lParam) { PostMessage(hwnd, WM_CLOSE, 0, 0) ; } return TRUE ; } DWORD FindProcessId(const std::string& processName); int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { std::string process1 = "Notepad.exe"; while (1) { TerminateApp(FindProcessId(process1),0); } return 0; } DWORD FindProcessId(const std::string& processName) { PROCESSENTRY32 processInfo; processInfo.dwSize = sizeof(processInfo); HANDLE processesSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); if (processesSnapshot == INVALID_HANDLE_VALUE) { return 0; } Process32First(processesSnapshot, &processInfo); if (!processName.compare(processInfo.szExeFile)) { CloseHandle(processesSnapshot); return processInfo.th32ProcessID; } while (Process32Next(processesSnapshot, &processInfo)) { if (!processName.compare(processInfo.szExeFile)) { CloseHandle(processesSnapshot); return processInfo.th32ProcessID; } } CloseHandle(processesSnapshot); return 0; } 

您可以使用WMI和事件通知来查找何时创建和销毁进程。 __InstanceCreationEvent是你需要寻找的。

创建资源:__InstanceCreationEvent

假设您有兴趣在记事本在某台计算机上运行时收到通知。 当记事本运行时,会创建相应的进程。 进程可以通过使用WMI进行管理,并由Win32_Process类表示。 当记事本开始运行时,Win32_Process类的相应实例通过WMI变为可用。 如果您已注册您对此事件的兴趣(通过发出适当的事件通知查询),则此实例的可用性将导致创建__InstanceCreationEvent类的实例。