Сними процесс в Windows


Предлагаю не слишком известный способ снятия процесса в Windows9х. Описание не претендует на полноту.
Прерывание (снятие) процесса в Windows возможно с помощью функции API - TerminateProcess. У ней следующие параметры: hProcess:HANDLE и uExitCode:UINT. Первый - это указатель на процесс, второй - код выхода для процесса. Значит, что нам надо? Надо получить указатель. Есть несколько способов. Но я пользуюсь следующим.
Пример я буду приводить на Дельфях.
Для использование необходимых функций нужно подключить модуль TLHelp32. А так же объявить переменную типа TProcessEntry32. Пусть у нас это будет выглядеть типа var Mod32:TProcessEntry32. Кстати это структура. (для более полной информации смотрите tlhelp32.pas). Теперь мне надо получить список процессов, чтоб выбрать оттуда нужный, и прервать его выполнение. Делается это следующим образом. Сначала загоняем размер структуры в неё саму
Mod32.dwSize:=Sizeof(TProcessEntry32W);.
Теперь снимаем снапшот с процессов -
s1 : = CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);,
где s1:Handle;. Теперь в s1 у нас указатель на список процессов. Начинаем проверять каждый процесс на принадлежность к нужному нам. И если найден то снимем его ;):
if Process32First(S1, Mod32) then
Repeat
temp:=ExtractFileName(Mod32.szExeFile);
if temp='NOTEPAD.EXE' then begin
s2:=OpenProcess(PROCESS_TERMINATE,false,Mod32.th32ProcessID);
TerminateProcess(s2,0);
end;
Next:=Process32Next(s1, Mod32);
Until Not Next;
CloseHandle(S1)
Вот так мы сняли запущенный блокнот. Здесь s2: Handle; - указатель на процесс, который необходимо снять, Next:Boolean - указывает есть ли еще процессы в списке. Используем алгоритм First-Next. Т.е. если кто знаком с FindFirst, FindNext, то вопросов не должно возникнуть. Так вот, если имя файла запущенного процесса нам подходит, то мы делаем в s2 OpenProcess, а после, рассмотренный нами TerminaetProcess. Просто TerminateProcess работать не будет (установлено практически). Надо обязательно сделать OpenProcess, а потом прерывать. Опции функции OpenProcess вы можете посмотреть в MS SDK Help Files (они стандартно ставятся вместе с делфой).

Есть конечно еще один, всем известный способ с findwindow() и postmessage(). Для тех кто не в курсе кратко:
If findwindow(nil,'Безымянный - Блокнот')<>0 then
Postmessage(findwindow(nil,'Безымянный - Блокнот'), wm_quit);
Т.е. мы ищем окно по его заголовку, и если нашли, то посылаем ему сообщение postmessage() с командой выхода (wm_quit). Но приведенный способ будет работать только с программами, имеющими окна. Если же процесс не имеет окон, то данный способ бесполезен.
Блокнот был приведен только в качестве примера. А так вы можете прервать почти любой процесс.
Кстати для любопытных советую проштурмовать tlhelp32.pas, так как снятие процесса это только часть возможностей реализуемых этим модулем.
Ну вроде все.