Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.02;
Скачать: CL | DM;

Вниз

Закрыть программу с запросом   Найти похожие ветки 

 
yurai   (2004-11-15 07:48) [0]

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


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

TerminateProcess(GetCurrentProcess, 0)


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

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


 
WondeRu ©   (2004-11-16 09:15) [3]

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

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


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

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

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 10:09) [5]

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;


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

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

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


 
kaZaNoVa ©   (2004-11-17 21:53) [7]

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


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


>     TerminateProcess(wnd,0);


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

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

Грустно.


 
kaZaNoVa ©   (2004-11-17 22:10) [9]

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

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

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


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

Например: 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;


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


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


Фтопку



Страницы: 1 вся ветка

Текущий архив: 2005.01.02;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.047 c
9-1094475715
WondeRu
2004-09-06 17:01
2005.01.02
OpenAL. Как увеличить громкость источника?


1-1103388317
Ivolg
2004-12-18 19:45
2005.01.02
Компоненты


14-1102735159
Думкин
2004-12-11 06:19
2005.01.02
С днем рождения! 11 декабря


3-1102393055
Dmitriy O.
2004-12-07 07:17
2005.01.02
TRxDbGrid OnTitleClick


14-1102494768
truster
2004-12-08 11:32
2005.01.02
контейнерные файлы