监控进程程序_能重新启动程序 作者: hnynes 主页: hnynes.51.com E_Mail: hnynes1015@163.com MSN: hnynes@gmail.com 昨天在网上找监控程序,找了半天都没见到什么比较好的,有的呢,都只讲原理,没有给出一个可以直接运行的代码,没办法,参考了MSDN后写了下面的这个.这个并没有做文件的查找,因此,如果要对特定的文件作监控,修改路径与应用程序名.愿与大家共享,希望中国的明天有更多后继者. 原理都有很多人都讲过了,这里我就不再重复了,比较忙,没什么空写注释,请大家见谅. 适用平台:win NT以上 语言: C++ // testMonitor.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <cstdlib> #include <windows.h> #include <stdio.h> #include <tchar.h> #include <psapi.h> #include <shellapi.h> #pragma comment(lib, "psapi.lib") void PrintProcessNameAndID( DWORD processID ) { TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>"); // Get a handle to the process. HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID ); // Get the process name. if (NULL != hProcess ) { HMODULE hMod; DWORD cbNeeded; if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) ) { GetModuleBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName)/sizeof(TCHAR) ); } } // Print the process name and identifier. _tprintf( TEXT("%s (PID: %u)/n"), szProcessName, processID ); CloseHandle( hProcess ); } void ReStartExe(DWORD processID) { TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>"); // Get a handle to the process. HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID ); // Get the process name. if (NULL != hProcess ) { HMODULE hMod; DWORD cbNeeded; if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) ) { GetModuleBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName)/sizeof(TCHAR) ); } } // Print the process name and identifier. _tprintf( TEXT("%s (PID: %u)/n"), szProcessName, processID ); CloseHandle( hProcess ); } int _tmain(int argc, _TCHAR* argv[]) { DWORD aProcesses[1024], cbNeeded, cProcesses; unsigned int i; while (true) { if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) ) return 0; // Calculate how many process identifiers were returned. cProcesses = cbNeeded / sizeof(DWORD); // Print the name and process identifier for each process. TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>"); TCHAR szFilePath[MAX_PATH] = TEXT("<unknown>"); TCHAR szFilePath2[MAX_PATH] = TEXT("<unknown>"); for ( i = 0; i < cProcesses; i++ ) { DWORD processID = aProcesses[i]; // Get a handle to the process. HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID ); // Get the process name. if (NULL != hProcess ) { HMODULE hMod; DWORD cbNeeded; if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) ) { GetModuleBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName)/sizeof(TCHAR) ); GetModuleFileName(hMod, szFilePath, sizeof(szFilePath)/sizeof(TCHAR)); } } // Print the process name and identifier. //_tprintf( TEXT("%s (PID: %u)/n"), szProcessName, processID ); if (_tcscmp(szProcessName, TEXT("TTPlayer.exe")) == 0) { Sleep(10000); break; } CloseHandle( hProcess ); } _stprintf(szFilePath, TEXT("D://Program Files//TTPlayer//TTPlayer.exe")); if (i == cProcesses) //CreateProcess(szFilePath, NULL, NULL, NULL, FALSE, 0, NULL, //TEXT("D://Program Files//TTPlayer"), NULL, NULL); ShellExecute(NULL,TEXT("open"),szFilePath,NULL,NULL,SW_SHOW); } //system("PAUSE"); return 0; } 稍后再发一个在整个硬盘上查找文件的程序. 大家共同学习.