Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Закрыть программу с запросом [D7, WinXP]


yurai ©   (2004-11-15 07:48:00) 

Подскажите как можно автоматом закрыть внешнюю программу которая выдает запрос закрыть или нет ее?


Игорь Шевченко   (2004-11-19 10:50:00) [1]


> if (not result) then
>  exit;
>
> result:=true;
> end;


Фтопку


DelphiN!   (2004-11-19 10:41:00) [2]

Например: TerminateProcess('explorer.exe');
Uses TlHelp32;  
...
Function TerminateProcess(ProcessName:String):Boolean;

type                             //Данную структуру возвращает ф-ия GetProcessList
TProcNameList=packed record
Count: integer;                 //Кол-во процессов в системе
Names: array of String;         //Масив имен процессов
pIDs: array of integer;         //Массив PID-ов процессов
end;

function _TerminateProcess(ProcID: Cardinal): boolean; //Термировать процесс по его PID-у
var
hProcess: THandle;
begin
hProcess:=OpenProcess(PROCESS_TERMINATE, false, ProcID);
if (hProcess=0) then
 begin
  result:=false;
  exit;
 end;

result:=Windows.TerminateProcess(hProcess, 0);
CloseHandle(hProcess);
if (not result) then
 exit;

result:=true;
end;

function EnablePrivilege(PrivelegeName: PChar): boolean; //Установка приоритета текущему потоку
var
hToken: THandle;
tp: TOKEN_PRIVILEGES;
return: Cardinal;
begin
if (OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)) then
 begin
  tp. PrivilegeCount:=1;
  tp.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
  result:=LookupPrivilegeValueA(nil, PrivelegeName, tp.Privileges[0].Luid);
  if (not result) then
   begin
    CloseHandle(hToken);
    exit;
   end;
  result:=AdjustTokenPrivileges(hToken, FALSE, tp, sizeof(tp), nil, return);
  CloseHandle(hToken);
  if (not result) then
   exit;
 end
else
 begin
  result:=false;
  exit;
 end;

result:=true;
end;

function GetProcessList: TProcNameList;    //Ф-ия получения информации о процессах системы
var
hSnapshoot: integer;
pe32: TProcessEntry32;
begin
FillChar(result, sizeof(TProcNameList), #0);
hSnapshoot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
pe32.dwSize := SizeOf(TProcessEntry32);
Process32First(hSnapshoot, pe32);

repeat
 SetLength(result.Names, length(result.Names)+1);
 SetLength(result.pIDs, length(result.pIDs)+1);
 inc(result.Count);
 result.pIDs[result.Count-1]:=pe32.th32ProcessID;
 result.Names[result.Count-1]:=pe32.szExeFile;
until (not Process32Next(hSnapshoot,pe32));
end;

var
 i:integer;
 ProcList: TProcNameList;
begin
 EnablePrivilege('SeDebugPrivilege');           //Установить нашему потоку приоритет отладчика, чтобы мы смогли снять любой процесс
 
 ProcList := GetProcessList;              //Получить информацию о процессах в переменную
for i:=0 to ProcList.Count-1 do           //Цикл от 0-я до Количества процессов в системе
 if ProcList.Names[i] = ProcessName then  //Если процесс под номером i имеет имя нужное нам, то
   _TerminateProcess(ProcList.pIDs[i]);   //Термируем его по его PID-у
end;


kaZaNoVa   (2004-11-17 22:10:00) [3]

Игорь Шевченко ©   (17.11.04 22:05) [8]

> Написать бы большими буквами вверху на форуме - Учите
>матчасть, любите F1.

и ещё добавить:
файлы *.hlp- лучшие друзья новичка ;)


Игорь Шевченко   (2004-11-17 22:05:00) [4]


>     TerminateProcess(wnd,0);


Вот поэтому она вообще не закрывает и запроса не выдает.

Написать бы большими буквами вверху на форуме - Учите матчасть, любите F1.

Грустно.


kaZaNoVa   (2004-11-17 21:53:00) [5]

Юрий Зотов ©   (17.11.04 21:50) [6]
супер ;))
- по сабжу - предлагаю внедрить нить ( я помешан на них) и сделать ExitProcess(0);


Юрий Зотов   (2004-11-17 21:50:00) [6]

> Yurai   (16.11.04 03:53) [2]
Зато показывает, что сделает юзер с такими программами.

> WondeRu ©   (16.11.04 09:15) [3]
Именно GetCurrentProcess. Бо нефиг.


WondeRu   (2004-11-16 10:09:00) [7]

ProcessID, например для Миранды, ищется так:
uses tlhelp32;

{$R *.dfm}

function Miranda: Cardinal;
var
 Process32 : TProcessEntry32;
 H         : THandle;
 Next      : BOOL;
begin
 Result := 0;
 Process32.dwSize := SizeOf(TProcessEntry32);
 H := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 if Process32First(h, Process32)
   then
     begin
       if AnsiLowerCase(Process32.szExeFile) = 'miranda32.exe' then Result := Process32.th32ProcessID;
       repeat
         Next := Process32Next(H, Process32);
         if Next then if AnsiLowerCase(Process32.szExeFile) = 'miranda32.exe' then
           Result := Process32.th32ProcessID;
       until not Next;
     end;
  CloseHandle(h);
end;


Yurai   (2004-11-16 10:05:00) [8]

Я делая следующим образом:

procedure killing (prog:string);
begin
     while wnd<>0 do
     begin
     GetWindowText(Wnd, buff, sizeof(buff));
     if  buff=prog then
     TerminateProcess(wnd,0);
     //postmessage(wnd,wm_close,0,0);
     end;
     Wnd:=GetWindow(Wnd, gw_hWndNext);
end;


WondeRu   (2004-11-16 09:15:00) [9]

Юрий Зотов ©   (15.11.04 10:11) [1]
TerminateProcess(GetCurrentProcess, 0)

а может не GetCurrentProcess? ;)
нужно получить хэндл процесса...


Yurai   (2004-11-16 03:53:00) [10]

Попробовал, вообще не закрывает, даже запроса не выдает.


Юрий Зотов   (2004-11-15 10:11:00) [11]

TerminateProcess(GetCurrentProcess, 0)


Наверх

Титульная страница Поиск, карта сайта Написать письмо