Wyłączanie procesów

modrih

Każdy wie że zawieszony komputer ratujemy przez zamykanie programów, lub procesów, i to najczęściej przez tak zwaną świętą trójcę - Alt + CTRL + DEL.

Pracując na komputerze w bibliotece szkolnej, jak zwykle zawiesiłem system, powodem "zwiechy" była pewna aplikacja, chciałem ją wyłączyć przez ?standardową? kombinację, a tu niespodzianka, administrator zablokował korzystanie z Menadżera zadań. Postanowiłem więc napisać prościutki program który będzie miał za zadanie wyłączyć wybrany proces.

Jego podstawowe zadanie to wyświetlenie listy procesów w ListBox1, wraz z cyferkami odpowiadającymi uruchomianemu procesowi. My zaś mamy za zadanie wpisać w komponent TEdit - ?proces? owy numerek i naciśnięcie przycisku Button1. Po czym proces zostaje zamknięty, a lista procesów odświeżona poleceniem: ListBox1.Items:=ListaPlikow. Gdyby zaś potrzebna nam była ?ręczna? aktualizacja listy procesów naciskamy przycisk Button2.

Poniżej prezentuję cały kod źródłowy, zauważ że w sekcji uses dodałem TLHelp32.
Mimo wielu ograniczeń w profilu udało mi się odpalić program w szkolnej bibliotece, wykorzystuję go zamiast standardowej kombinacji.

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    GroupBox1: TGroupBox;
    Button1: TButton;
    Label1: TLabel;
    proces: TEdit;
    GroupBox2: TGroupBox;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

function ZabijProces(ProcessId:Integer):Boolean;
var
  Uchwyt:tHandle;
begin
  Uchwyt:=OpenProcess(PROCESS_TERMINATE,bool(0),ProcessId);
  if TerminateProcess(Uchwyt,0) then result:=true else result:=false;
  CloseHandle(Uchwyt);
end;

function ListaPlikow:TStringList;
var
  Uchwyt:tHandle;
  Proces:tProcessEntry32;
begin
  Uchwyt:=CreateToolHelp32SnapShot(TH32CS_SNAPALL,0);
  Proces.dwSize:=SizeOf(Proces);
  Result:=TStringList.Create;
  if Integer(Process32First(Uchwyt,Proces))<>0 then
  repeat
    Result.Append(IntToStr(Proces.th32ProcessID)+': '+Proces.szExeFile);
  until Integer(Process32Next(Uchwyt,Proces))=0;
  closehandle(Uchwyt);
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  ListBox1.Items:=ListaPlikow;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  try
    Zabijproces(strtoint(proces.text));                       //wywołanie funkcji
    ListBox1.Items.Clear;                                     //wyczyść ListBox1
    proces.Text := '';                                        //wyczyść okno na numerek
    Application.MessageBox(Pchar('Proces został wyłączony.'), //komunikat że wszystko ok.
                'Informacja', MB_OK + MB_IconInformation);
    ListBox1.Items:=ListaPlikow;                              //uzupełnij listę procesami
  except                                                      //jeżeli błąd - nie wpisałeś numerku
    begin
      Application.MessageBox(Pchar('Wpisz numerek odpowiadający procesowi.'), //informacja
                  'Informacja', MB_OK + MB_IconInformation);
    end;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  ListBox1.Items:=ListaPlikow;  //odśwież listę procesów
end;

end.

5 komentarzy

memo1.lines:=listaplikow

A jak przerobić ten program, żeby zamiast wpisywać numeru wpisywać nazwę procesu?

Zamiast wpisywania numeru proponuję:

procedure TForm1.ListBox1Click(Sender: TObject);
var
  i:integer;
  S:String;
begin
  proces.Text := '';
  S:= ListBox1.Items.ValueFromIndex[ListBox1.ItemIndex];
  for i:=0 to pos(':', S)-1 do begin
    proces.Text := proces.Text + S[i];
  end;
end;

Po kliknięciu na listę, pole same się wypełni. Przyczym mała poprawka:
W funkcji ListaPlikow, w pętli repeat:

Result.Append(' '+IntToStr(Proces.th32ProcessID)+': '+Proces.szExeFile);
  • dodajemy spację przed każdą liczbą.

Dało by radę zrobić to wszystko, aby zapisywalo w memo ??

Szkoda tylko, że nie działa pod win 98