Просмотрщик запущенных процессов

Материал из DRKB

Просмотрщик запущенных процессов[править | править код]

Программа не видна по Ctrl+Alt+Del, и сама оттуда же может спрятать любой из процессов(правда, не все с самого начала "светятся" по Ctrl+Alt+Del) или завершить его. Простой пример для знакомства с ToolHelp32.

В исходном коде есть недоработки, например, процедура Delproc получает в качестве параметра строку, затем переводит ее в целочисленный тип(integer), хотя можно передавать сразу число. Заморочка была в проверке числа-индекса на подлинность, а так как я выдрал часть кода из более ранней своей проги, я не стал это менять, а просто подогнал до рабочей версии. Оптимизацией кода вы можете заняться сами по желанию(вы можете, если хотите, а если не хотите, то вы не обязаны, вы посто могли бы... да... :))) Программа не работала в WinNT 4.0, но в Win9x работать должна.


unit main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, tlhelp32, StdCtrls, ComCtrls, Buttons;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Button1: TButton;
    Button2: TButton;
    Button4: TButton;
    Button5: TButton;
    StatusBar1: TStatusBar;
    Button6: TButton;
    procedure Button4Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
  private
    { Private declarations }
    procedure ListProcesses;
    procedure DelProc(numb: string);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  processID: array[1..50] of Integer;

function RegisterServiceProcess(dwProcessID, dwType: Integer): Integer;
  stdcall; external 'kernel32.dll';

implementation

{$R *.DFM}

procedure TForm1.DelProc(numb: string);
var
  c1: Cardinal;
  pe: TProcessEntry32;
  s1, s2: string;
  x: Integer;
begin
  x := 0;
  try
    StrToInt(numb);
  except
    Statusbar1.SimpleText := 'Invalid number';
    exit;
  end;
  c1 := CreateToolHelp32Snapshot(TH32CS_SnapProcess, 0);
  if c1 = INVALID_HANDLE_VALUE then
  begin
    Statusbar1.SimpleText := 'Process listing failed';
    exit;
  end;
  try
    pe.dwSize := SizeOf(pe);
    if Process32First(c1, pe) then
      repeat
        Inc(x);
        s1 := ExtractFileName(pe.szExeFile);
        s2 := ExtractFileExt(s1);
        Delete(s1, Length(s1) + 1 - Length(s2), MaxInt);
        if x = StrToInt(numb) then
          if TerminateProcess(OpenProcess(PROCESS_ALL_ACCESS, False, pe.th32ProcessID), 1) then
          begin
            Statusbar1.SimpleText := 'Process ' + s1 + ' terminated.';
          end
          else
            Statusbar1.SimpleText := ('Couldnt terminate process' + pe.szExeFile);
      until not Process32Next(c1, pe);
  finally
    CloseHandle(c1);
  end;
end;

procedure Tform1.ListProcesses;
var
  c1: Cardinal;
  pe: TProcessEntry32;
  s1, s2: string;
  x: Integer;
begin
  X := 0;
  c1 := CreateToolHelp32Snapshot(TH32CS_SnapProcess, 0);
  if c1 = INVALID_HANDLE_VALUE then
  begin
    Statusbar1.SimpleText :=
      ('Информация о процессах закрыта.');
    exit;
  end;
  try
    pe.dwSize := SizeOf(pe);
    if Process32First(c1, pe) then
      repeat
        Inc(x);
        s1 := ExtractFileName(pe.szExeFile);
        s2 := ExtractFileExt(s1);
        Delete(s1, Length(s1) + 1 - Length(s2), MaxInt);
        Listbox1.Items.Add(IntToStr(x) + '  ' + s1 + '  :  ' + pe.szExeFile);
        ProcessId[x] := pe.th32ProcessID;
        //ListBox1.Items.Add(inttostr(pe.th32ProcessID));
      until not Process32Next(c1, pe);
  finally
    CloseHandle(c1);
  end;

end;



procedure TForm1.Button4Click(Sender: TObject);
begin
  Close;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Button1.Enabled := False;
  Button5.Enabled := False;
  Button6.Enabled := False;
  ListProcesses();
  if not (csDesigning in ComponentState) then
    RegisterServiceProcess(GetCurrentProcessID, 1);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Listbox1.Clear();
  ListProcesses();
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  p: Integer;
begin
  // hide
  with Listbox1 do
    p := Listbox1.Items.IndexOf(Listbox1.Items[ItemIndex]) + 1;
  if not (csDesigning in ComponentState) then
    RegisterServiceProcess(ProcessID[p], 1);
  with Listbox1 do
    StatusBar1.SimpleText := (Listbox1.Items[ItemIndex] + ' hidden');
end;

procedure TForm1.Button5Click(Sender: TObject);
var
  p: Integer;
begin
  // show
  with Listbox1 do
    p := Listbox1.Items.IndexOf(Listbox1.Items[ItemIndex]) + 1;
  if not (csDesigning in ComponentState) then
    RegisterServiceProcess(ProcessID[p], 0);
  with Listbox1 do
    StatusBar1.SimpleText := (Listbox1.Items[ItemIndex] + ' shown');
end;

procedure TForm1.ListBox1Click(Sender: TObject);
begin
  Button1.Enabled := True;
  Button5.Enabled := True;
  Button6.Enabled := True;
end;

procedure TForm1.Button6Click(Sender: TObject);
var
  p: Integer;
begin
  with Listbox1 do
    p := Listbox1.Items.IndexOf(Listbox1.Items[ItemIndex]) + 1;
  DelProc(IntToStr(p));
end;

end.


Source: Взято из http://forum.sources.ru
ID: 02041