Шаг 33 - Win98 как NT. Убиваем процесс

Итак, мы с Вами получили список процессов. Теперь на диалоговую панель добавим новую кнопку Terminate Process. Если в списке выделен процесс, то по нажатию на эту кнопку процесс будет удален. Вот код:

void CScanProcessDlg::OnTernimate() 
{
	int inIndex;
	inIndex=m_List1.GetCurSel();
	if (inIndex!=LB_ERR)
	{
		CString csExName;
		m_List1.GetText(inIndex,csExName); 
		HANDLE hSnap;
	 	hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
		if (hSnap == NULL) 
		{
			AfxMessageBox("Error Load ToolHelp");
		} else {
			PROCESSENTRY32 proc;
			if (Process32First(hSnap, &proc))
			{
				if (csExName==proc.szExeFile)
					TerminateProcess(hSnap,0); 
				while (Process32Next(hSnap, &proc)) 
				{
					if (csExName==proc.szExeFile)
					{
						HANDLE ProcessHandle=NULL;
						ProcessHandle = OpenProcess(SYNCHRONIZE,
							TRUE, proc.th32ProcessID);
						if (ProcessHandle!=NULL)
						{
							TerminateProcess(ProcessHandle,0);
							CloseHandle(ProcessHandle);
							Sleep(5000);
							OnScan(); 
						}
						else
							AfxMessageBox("Not Open Process");
					}
				}
				CloseHandle(hSnap);
			}
		}
	} else AfxMessageBox("Select Process");
}

Сначала проверяем выбран ли элемент списка if (inIndex!=LB_ERR). Если выбран пробегаем по процессам. Код повторяется как при сканировании процесса. Конечно можно было создать массив при сканировании. Но процесс дело тонкое, то он есть, а то его нет. Лучше на мой взгляд просканировать еще раз. Если его находим, то открываем с помощью функции OpenProcess(). Дальше спокойно вызываем TerminateProcess.

HANDLE OpenProcess
(
	DWORD dwDesiredAccess,	// флаг доступа
	BOOL bInheritHandle,	// флаг наследования
	DWORD dwProcessId		// идентификатор процесса
);

Идентификатор процесса мы берем из структуры PROCESSENTRY32 - это переменная, которая заполняется при запуске.

BOOL TerminateProcess(
	HANDLE hProcess,	// Указатель процесса
	UINT uExitCode	// Код возврата процесса
);

Задержку я сделал для того, чтобы обновить список через некоторое время, так как удаление процесса не моментальное дело. Программу я испытывал на Windows 98. Удаляет все процессы кроме Kernel :) Оно и понятно, сам себя удалять не будешь. При этом помните шаг "Шаг 31 - Программа, которая не удаляется из списка задач". Отсюда удалить ее можно и это получается. Кроме того удалить можно и процесс оболочки. Все работает как в NT. Отсюда рождается много интересных вещей. Например, можно выяснить почему тормозит Windows. Многие процессы просто не нужны для работы. Попробуйте поудаляйте.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.