Živě.cz o počítačích a internetu

Tipy a triky v Delphi, díl 114. - ukončujeme jiné aplikace

Jan Šindelář - 29.10.2003

Je tomu už hodně dávno, co jsme se v našem seriálu pokoušeli velice primitivním jednoduchým způsobem ukončovat cizí aplikace. Dnešní procedura je poněkud složitější, ukončuje cizí procesy prostřednictvím jejich handle a pracuje na všech Windows systémech.

Náš velmi jednoduchý příklad ukazuje ukončení Poznámkového bloku, přičemž handle jeho okna nalezneme pomocí funkce FindWindow, se kterou jsme se v našem seriálu potkali už několikrát. Takto získaný handle pak pošleme naší funkci, která Poznámkový blok ukončí.

Stačí tedy na prázdný formulář umístit tlačítko, které celou akci spustí. Pochopitelně nezapomeňte spustit při testování příkladu také zmiňovaný Poznámkový blok, jinak nic neuvidíte.

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

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
    GetWindowThreadProcessID(hWindowHandle, @hprocessID);
    if hprocessID <> 0 then
    begin
      processHandle := OpenProcess(PROCESS_TERMINATE or PROCESS_QUERY_INFORMATION, False, hprocessID);
      if processHandle <> 0 then
      begin
        TerminateProcess(processHandle, 0);
        CloseHandle(ProcessHandle);
      end;
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  KillProcess(FindWindow(`notepad`,nil));
end;

end.

No a to je vlastně všechno, protože není celkem co dodat. Tímto způsobem tedy lze ukončovat procesy či aplikace a příklad vám bude fungovat i na starších verzích Windows.