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.
memo1.lines:=listaplikow
A jak przerobić ten program, żeby zamiast wpisywać numeru wpisywać nazwę procesu?
Zamiast wpisywania numeru proponuję:
Po kliknięciu na listę, pole same się wypełni. Przyczym mała poprawka:
W funkcji ListaPlikow, w pętli repeat:
Dało by radę zrobić to wszystko, aby zapisywalo w memo ??
Szkoda tylko, że nie działa pod win 98