Delphi Killtask ve Killprocess

By Burak TUNGUT - 20.11.2012 - Kategori Diğer Diller

Delphi de istersek görünür ad ve uzantısını kullanarak KillTask ile istersek de Handle numarasını kullanarak KillProcess ile program kapatabiliriz.

Kendi kütüphanelerinde böyle bir imkan bulunmadığı için 2 adet küçük fonksiyon ile çalışmasını istemediğimiz programları ister adlarıyla ister Handle numaralarıyla çalışmasını düzgün bir şekilde sonlandırabiliriz.

Nerde, Ne zaman ?

Bir proje geliştiriyorsunuz herşey yolunda giderken sizin geliştirdiğiniz sisteme aykırı çalışan ya da istediğiniz verimi engelleyen bir kaç çalışan uygulama karşınıza çıktı ve bunları hatasız bir şekilde sonlandırmanız gerekiyor.
İşte tam da burda bu iki fonksiyondan birini kullanarak amacınıza ulaşabilirsiniz.
 

KillTask Fonksiyonu

function KillTask(ExeFileName: string): Integer;
const
  PROCESS_TERMINATE = $0001;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
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(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
      UpperCase(ExeFileName))) then
      Result := Integer(TerminateProcess(
                        OpenProcess(PROCESS_TERMINATE,
                                    BOOL(0),
                                    FProcessEntry32.th32ProcessID),
                                    0));
     ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
end;

 

KillProcess Fonksiyonu

procedure KillProcess(hWindowHandle: HWND);
var
  hprocessID: INTEGER;
  processHandle: THandle;
  DWResult: DWORD;
begin
  SendMessageTimeout(hWindowHandle, WM_CLOSE, 0, 0,
    SMTO_ABORTIFHUNG or SMTO_NORMAL, 5000, DWResult);
  if isWindow(hWindowHandle) then
  begin
    { Get the process identifier for the window}
    GetWindowThreadProcessID(hWindowHandle, @hprocessID);
    if hprocessID <> 0 then
    begin
      { Get the process handle }
      processHandle := OpenProcess(PROCESS_TERMINATE or PROCESS_QUERY_INFORMATION,
        False, hprocessID);
      if processHandle <> 0 then
      begin
        { Terminate the process }
        TerminateProcess(processHandle, 0);
        CloseHandle(ProcessHandle);
      end;
    end;
  end;
end; 

 

Örnek

Bilgisyarımızdan not defteri uygulamasını ve KillTask fonksiyonu ile de aşşağıdaki işlemi uygulayalım,

KillTask('Notepad.exe');

Yorum Bırak

Facebook
Son Yorumlar