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

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

Закрытие др.приложение [D7, Win2k]


Peter_cc ©   (2005-03-09 18:10:00) 

Здравствуйте мастера!!!!
Как программно закрыть другое приложение, которое сейчас запущенно (известно как оно называется) Спасибо!


Sergey_Masloff   (2005-03-09 18:54:00) [1]

Лист бокс заполняется на форме выбираешь процесс и киляешь.


Sergey_Masloff   (2005-03-09 18:53:00) [2]


unit MainForm;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls;

type

 TfmMain = class(TForm)
   btProcessInfo: TButton;
   ListBox1: TListBox;
   btExit: TButton;
   btKill: TButton;
   procedure btProcessInfoClick(Sender: TObject);
   procedure btExitClick(Sender: TObject);
   procedure btKillClick(Sender: TObject);
 private

 public
   
 end;

var
 fmMain: TfmMain;

implementation
uses tlhelp32; {Tool Help Functions, Types, and Definitions}

{$R *.DFM}

procedure TfmMain.btProcessInfoClick(Sender: TObject);
var
 handler:thandle;
 data:TProcessEntry32;
 s : String;

 {Имя процесса это не String а массив символов. Для его чтения в String
  следующая функция:}
 function return_name : String;
   var
     i : byte;
     names : String;
 begin
   names := '';
   i := 0;
   while data.szExeFile[i] <> '' do begin
     {Читаем массив символов до терминального символа}
     names := names + data.szExeFile[i];
     inc(i);
   end;
   //return_name:=names;
   Result := names;
 end;

begin
 ListBox1.Items.Clear();
 handler:=CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);  {Получили мгновенный снимок процесов}
 if Process32First(handler,data) then begin
   {Так как к каждой строке в TStrings можно привязать свой объект (то есть
   указатель длиной в 4 байта) то эти 4 байта можно смело использовать
   для хранения чего-то что помещается в 4 байта, а именно ProcessId процесса
   имя которого записывается в саму строку. Кстати, сам указатель почистит
   за собой TStrings так что и с этого боку все хорошо }
   ListBox1.Items.AddObject(return_name,TObject(data.th32ProcessID));
   while Process32Next(handler,data) do begin
     s := return_name();
     ListBox1.Items.AddObject(s,TObject(data.th32ProcessID));
   end;
 end else
   showmessage('Ошибка получения информации!');
end;

procedure TfmMain.btExitClick(Sender: TObject);
begin
 Close();
end;

procedure TfmMain.btKillClick(Sender: TObject);
var
 VictimName : String;
 VictimProcessId : DWORD;
 s : String;
 VictimHandle : THandle;
begin
 if ListBox1.ItemIndex > 0 then
 begin
   VictimName := ListBox1.Items[ListBox1.ItemIndex];
   VictimProcessId := DWORD(ListBox1.Items.Objects[ListBox1.ItemIndex]);
   s := Format('Попробуем убить "%s"?',[VictimName]);
   if MessageBox(Self.Handle,PChar(s),'',MB_YESNO)=ID_YES then
   begin
     VictimHandle := OpenProcess(PROCESS_TERMINATE,False,VictimProcessId);
     if VictimHandle > 0 then {Если хэндл успешно получен}
     begin
       if TerminateProcess(VictimHandle,1)  then {Пробуем убить процесс пользуясь полученным хэндлом}
       begin
         ShowMessage(Format('%s убит',[VictimName]));
         ListBox1.Items.Delete(ListBox1.ItemIndex);
       end else
         ShowMessage(Format('%s не убит',[VictimName]))
     end else
       ShowMessage(Format('Не удалось получить хэндл с правом убиения для %s по ProcessId!',[VictimName]));
   end;
 end;
end;

end.


Наверх

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