Текущий архив: 2003.07.07;
Скачать: CL | DM;
Вниз
Програмное завершение процессов в WinXP Найти похожие ветки
← →
Max Kronos (2003-04-17 18:10) [0]Доброго всем времени суток.
Я уже даено мучаюсь над проблемой програмного завершения процессов и никак не могу найти решения. Проблема вот в чем:
Я думаю многие видели в Инет и Game клубах програмки, кот-ые по истечению времени пользователя закрывают его(пользователя) приложения (игру). Так вот, пытался зеализовать это через:
1. PostMessage - работает только на окошках, банальный StarCraft закрыть не может.
2. TerminateProcess - закрывает большинство приграмм(игр), но часто после закрытия перестает вообще что-либо грузится(умные люди говорят что TerminateProcess засоряет память). А к примеру WarCraft III закрыть не может, т.к. после вызова TerminateProcess"а игра спрашивает пользователя действительно ли он хочет выйти. Отвитив НЕТ пользователь играет дальше.
Так вот, вопросы:
1. Как под WinXP получить список процессов.
2. Как из своей программы(работающей в фоновом режиме) завершить любой из них.
3. Как запретить показ панели со списком задач, процессов и т.п после нажатия Ctrl+Alt+Del.
Заранее спасибо.
← →
Scorp (2003-04-17 18:29) [1]Почитай в SDK j Tool Help Library. Там найдешь функцию, которая делает SnapShot всех процессов в системе с их ID и прочей инфой.
Самый простой способ закрыть процесс - TerminateProcess, и не слушай всякие глупости о том, что он засоряет пам"ять. Как писал дядька Рихтер, после TerminateProcess " завершенный процесс не оставляет после себя никаких следов" (стр.79, выделено курсивом!).
← →
Max Kronos (2003-04-17 18:40) [2]Так вот как раз в том то и дело, что TerminateProcess следы оставляет и еще какие(и это факт). А даже если бы не оставлял, то что делать с WarCraft"ом и т.п.
← →
Hammer (2003-04-24 12:45) [3]Как прибить процесс.
Код не мой.. Не помню где стянул, но работает везде, даже в ХР.
в uses добавить "tlhelp32"
дальше:
Function KillTask(FileName:String): integer; //0 - неудачно
var ContinueLoop:BOOL;
FSnapshotHandle:THandle;
FProcessEntry32:TProcessEntry32;
const
PROCESS_TERMINATE=$0001;
begin
Result := 0;
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
FProcessEntry32.dwSize:=Sizeof(FProcessEntry32);
ContinueLoop:=Process32First(FSnapshotHandle,FProcessEntry32);
while integer(ContinueLoop)<>0 do begin
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile))=UpperCase(FileName)) or
(UpperCase(FProcessEntry32.szExeFile)=UpperCase(FileName))) then
Result:=Integer(TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0), FProcessEntry32.th32ProcessID),0));
ContinueLoop:=Process32Next(FSnapshotHandle,FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
end;
вызов:
...
killTask("calc.exe");
...
← →
DVM (2003-04-24 12:53) [4]Warcraft III замечательно убивается с помощью TerminateProcess.
Следы в памяти - предрассудки.
То, что написали выше убъет Warcraft без разговоров, но в этом коде есть небольшие недочёты.
Страницы: 1 вся ветка
Текущий архив: 2003.07.07;
Скачать: CL | DM;
Память: 0.45 MB
Время: 0.007 c