方法1: 主要是向一个进程发WM_DESTROY消息, 然后等待它结束, 如果到时间没有结束, 就强制结束掉它.
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:先来个快照,列出所有进程信息, 然后查找列表中的进程名, 最后强制结束.
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: 自己写个脚本更方便!!
问题1:有的进程是要提高权限才能结束的,怎么提高本进程的权限哩?代码如下:
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掉这个进程后自己再以独占的方式打开,这样系统就不会再调用了。
CString strExplorerPath = "C://WINDOWS//Explorer.EXE";
bIsopen = exp_file.Open(strExplorerPath, CFile::shareExclusive); //独占方式打开文件,禁止其它进程对该文件的读
后记:
终于找到解决方法了, 都是微软的安全机制在搞鬼!
设置注册表:
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Winlogon/AutoRestartShell 设置为0 就可以不用它自动调用了,哈哈哈!!!