第三例:禁用程序

这个程序是我再重新再看这本书时,想起的以前写过的一个这样的程序,如今想起来觉得也是很好,因为此处这个程序完美的融合了前面的知识点。

介绍一下,这个程序书上没有的,我想到这个可以后台运行用来持续关闭掉任意一个程序,只要知道程序名字,格式如“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\n",pe32.szExeFile);
34         if(strcmp(pe32.szExeFile,p) == 0)
35         {
36             ProcessIdRet = pe32.th32ProcessID;
37             printf("\n\n\n");
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 }

 

posted @ 2017-01-30 00:15  泛未分晨  阅读(286)  评论(0编辑  收藏  举报