![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Закрыть программу с запросом [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)