这个程序是我再重新再看这本书时,想起的以前写过的一个这样的程序,如今想起来觉得也是很好,因为此处这个程序完美的融合了前面的知识点。
介绍一下,这个程序书上没有的,我想到这个可以后台运行用来持续关闭掉任意一个程序,只要知道程序名字,格式如“MicrosoftEdge.exe”,就可以后台关掉这个程序,并且无法再打开,原理就是在一个循环里不断查找这个成勋是否还存在,一旦发现存在立即关闭,如果没有发现,则持续查找,此程序可以通过任务管理器后台关闭,程序没有前台框框。
代码如下:
1 #include<stdio.h> 2 #include<windows.h> 3 #include<tlhelp32.h> 4 #include<string.h> 5 #include<stdlib.h> 6 //结束进程 7 bool TerminateProcessFromId(DWORD ProcessId) 8 { 9 bool bRet = false; 10 HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS,false,ProcessId); 11 if(hProcess != NULL) 12 { 13 bRet = ::TerminateProcess(hProcess,0); 14 } 15 ::CloseHandle(hProcess); 16 return bRet; 17 } 18 19 //通过进程名字查找进程ID 20 DWORD SearchProcessIdFromName(const char* p) 21 { 22 PROCESSENTRY32 pe32; 23 pe32.dwSize = sizeof(pe32); 24 DWORD ProcessIdRet =-1; 25 if(p == NULL) 26 { 27 return -1; 28 } 29 HANDLE hProcessSnapshot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); 30 bool bMore = ::Process32First(hProcessSnapshot,&pe32); 31 while(bMore) 32 { 33 printf("%s ",pe32.szExeFile); 34 if(strcmp(pe32.szExeFile,p) == 0) 35 { 36 ProcessIdRet = pe32.th32ProcessID; 37 printf(" "); 38 break; 39 } 40 bMore = ::Process32Next(hProcessSnapshot,&pe32); 41 } 42 ::CloseHandle(hProcessSnapshot); 43 return ProcessIdRet; 44 } 45 46 int main(int argc,char* argv[]) 47 { 48 HWND hwndDos = GetForegroundWindow();//获取前台窗口句柄 49 char szName[30]; 50 scanf("%s",szName); 51 ShowWindow(hwndDos,SW_HIDE);//隐藏前台窗口 52 while(1)//持续搜查并关闭监视的程序 53 { 54 DWORD dwProcessId = SearchProcessIdFromName(szName); 55 ::TerminateProcessFromId(dwProcessId); 56 } 57 return 0; 58 }