Итак, мы с Вами получили список процессов. Теперь на диалоговую панель добавим новую кнопку 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. Многие процессы просто не нужны для работы. Попробуйте поудаляйте.