方法1: 主要是向一个进程发WM_DESTROY消息, 然后等待它结束, 如果到时间没有结束, 就强制结束掉它.
BOOL KillProgram(CString strName) { DWORD id = FindAppProcessID(strName); if(id != -1) { DWORD bToKill = FALSE; HWND hWnd = ::FindWindow(NULL, strName); if(hWnd) { bToKill = ::PostMessage(hWnd, WM_DESTROY, 0, 0); if(!bToKill) SendMessageTimeout(hWnd, WM_QUERYENDSESSION, 0, 0, SMTO_ABORTIFHUNG, 3000, &bToKill);//SMTO_ABORTIFHUNG|SMTO_NOTIMEOUTIFNOTHUNG } if(!bToKill) { HANDLE ProcessHandle = OpenProcess(SYNCHRONIZE|PROCESS_TERMINATE, FALSE, id); if(ProcessHandle) { if(WaitForSingleObject(ProcessHandle, 3000) != WAIT_OBJECT_0) { TerminateProcess(ProcessHandle, 0); } CloseHandle(ProcessHandle); return TRUE; } } return TRUE; } return FALSE; }
方法2:先来个快照,列出所有进程信息, 然后查找列表中的进程名, 最后强制结束.
void CloseOnePorocess (CString strPorocess) { HANDLE SnapShot = CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS,0); if (SnapShot == INVALID_HANDLE_VALUE) return; PROCESSENTRY32 ProcessInfo; ProcessInfo.dwSize = sizeof(ProcessInfo); BOOL Status = Process32First (SnapShot, &ProcessInfo); while(Status) { HANDLE hProcess = NULL; hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, ProcessInfo.th32ProcessID ); if(strstr(ProcessInfo.szExeFile, strPorocess) != NULL) { ::TerminateProcess (hProcess, NULL); if (NULL != hProcess) CloseHandle (hProcess); break; } if (NULL != hProcess) CloseHandle (hProcess); Status = Process32Next(SnapShot, &ProcessInfo); } CloseHandle (SnapShot); }
炸一看, 第一种方法要好一点, 但是第一种方法查找进程的方法是FindWindow, 它的参数里指向一个以null结尾的、用来指定窗口名(即窗口标题)的字符串。如果此参数为NULL,则匹配所有窗口名。但是有的进程没有窗口, 所以也就没法用了。第二种方法虽然暴力一点, 但有时还是很有用地。
方法3: 自己写个脚本更方便!!
建立批处理: ntsd -c q -pn explorer.exe tskill explorer
问题1:有的进程是要提高权限才能结束的,怎么提高本进程的权限哩?代码如下:
//提升进程权限 // hProcess [in] : 要提升的进程,目标进程 // lpPrivilegeName [in] : 要提升到的特权,目标特权 // 返回值 : TRUE : 成功; FALSE : 失败 BOOL UpdateProcessPrivilege( HANDLE hProcess, LPCTSTR lpPrivilegeName) { HANDLE hToken; if ( ::OpenProcessToken( hProcess, TOKEN_ALL_ACCESS, &hToken ) ) { LUID destLuid; if ( ::LookupPrivilegeValue( NULL, lpPrivilegeName, &destLuid ) ) { TOKEN_PRIVILEGES TokenPrivileges; TokenPrivileges.PrivilegeCount = 1; TokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; TokenPrivileges.Privileges[0].Luid = destLuid; int iResult; if ( iResult = ::AdjustTokenPrivileges( hToken, FALSE, &TokenPrivileges, 0, NULL, NULL ) ) { return TRUE; } } } return FALSE; }
注:这段代码是转的。
问题2:代码结束explorer.exe进程!!(这可是有点难度的噢)
没错,上面的代码可以kill掉这个进程,问题是操作系统的安全机制能自己重新调出来之个进程!怎么办,我也没有很好的方法,只有一个投机的方法,就是kill掉这个进程后自己再以独占的方式打开,这样系统就不会再调用了。
// Kill Porcess CString strExplorerPath = "C://WINDOWS//Explorer.EXE"; bIsopen = exp_file.Open(strExplorerPath, CFile::shareExclusive); //独占方式打开文件,禁止其它进程对该文件的读
后记:
终于找到解决方法了, 都是微软的安全机制在搞鬼!
设置注册表:
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Winlogon/AutoRestartShell 设置为0 就可以不用它自动调用了,哈哈哈!!!