MFC编程小技巧——强制杀死进程
在某些应用场合下,我们可能需要在启动A进程启动时关闭进程B。MFC下该如何做呢?以下是我项目中用到的代码:
int KillProcess(DWORD Pid) { //打开进程得到进程句柄 HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,Pid); if(hProcess==NULL) { printf("OpenProcess error\n"); return 0; } //结束进程 if (TerminateProcess(hProcess,0)) { printf("结束进程成功\n"); return 0; } else { printf("结束进程失败\n"); return 0; } } int GetProcess() { char buff[1024]={0}; PROCESSENTRY32 pe32; pe32.dwSize=sizeof(pe32); //获得系统内所有进程快照 HANDLE hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); if(hProcessSnap==INVALID_HANDLE_VALUE) { printf("CreateToolhelp32Snapshot error"); return 0; } //枚举列表中的第一个进程 BOOL bProcess=Process32First(hProcessSnap,&pe32); while(bProcess) { //格式化进程名和进程ID wsprintf(buff,"%s---------------%d\r\n",pe32.szExeFile,pe32.th32ProcessID); //输出进程名和进程ID printf(buff); memset(buff,0x00,1024); //继续枚举进程 bProcess=Process32Next(hProcessSnap,&pe32); } CloseHandle(hProcessSnap); return 0; } bool EnableDebugPrivilege() { HANDLE hToken; LUID sedebugnameValue; TOKEN_PRIVILEGES tkp; if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) { return FALSE; } if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue)) { CloseHandle(hToken); return false; } tkp.PrivilegeCount = 1; tkp.Privileges[0].Luid = sedebugnameValue; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), NULL, NULL)) { CloseHandle(hToken); return false; } return true; } void CAngleDetectSystemDlg::CloseSecondSys() { EnableDebugPrivilege(); int rc = 0; HANDLE hSysSnapshot = NULL; PROCESSENTRY32 proc; hSysSnapshot = CreateToolhelp32Snapshot ( TH32CS_SNAPPROCESS, 0 ); if ( hSysSnapshot == (HANDLE)-1 ) return; proc.dwSize = sizeof(proc); if ( Process32First ( hSysSnapshot, &proc ) ) { do { if (stricmp(proc.szExeFile, "从机检测系统.exe") == 0) { HANDLE Proc_handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, proc.th32ProcessID); if (Proc_handle==NULL || !TerminateProcess(Proc_handle, 0)) rc = 1; else rc = 0; } } while ( Process32Next ( hSysSnapshot, &proc ) ); } CloseHandle ( hSysSnapshot ); return; }
其中void CAngleDetectSystemDlg::CloseSecondSys()是关闭进程的函数,“从机检测系统.exe”是需要关闭的进程,你可以换成自己需要关闭的进程名称。注意在关闭其他进程时,需要提升当前进程的权限。
顺便附上在A进程中启动B进程的代码:
void CAngleDetectSystemDlg::OpenSecondSys() { SHELLEXECUTEINFO sys2_shell = {sizeof(sys2_shell)}; sys2_shell.fMask = SEE_MASK_FLAG_DDEWAIT; sys2_shell.lpVerb = "open"; sys2_shell.lpFile = "从机检测系统.exe"; sys2_shell.nShow = SW_NORMAL; ShellExecuteEx(&sys2_shell); }