Дельфийские полезности

Автор: D`ART ( Black Cat Virology Network ). Перевод NeKr0!

Типа привет! Сегодня я рад представить вам немного кода, который может быть очень полезен для ВирМакеров.

1. Как скрыть вашу прогу от Ctrl+Alt+Del ?

function RegisterServiceProcess(dwProcessID, dwType: integer): 
         integer; stdcall; external 'KERNEL32.DLL';

implementation

procedure TForm1.Button1Click(Sender: TObject);
begin //Спрятать
  if not (csDesigning in ComponentState) then
    RegisterServiceProcess(GetCurrentProcessID, 1);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin //Показать
  if not (csDesigning in ComponentState) then
    RegisterServiceProcess(GetCurrentProcessID, 0);
end;

2. Как перехватить выход из Виндов?

...
private 
  { Private declarations } 
  procedure WMQE(var Message: TMessage); message WM_QUERYENDSESSION; 
...


procedure TMesForm.WMQE(var Message: TMessage); 
begin 
  inherited; 
  { Тут ваш код, который будет исполняться при выходе из Виндов}
end; 

3. Как получить список активных програм/задач?

procedure TTaskListForm.FormShow(Sender: TObject);
var
  Wnd : hWnd;
  buff: array [0..127] of Char;
begin
  ListBox1.Clear;
  Wnd := GetWindow(Handle, gw_HWndFirst);
  while Wnd <> 0 do begin
    if (Wnd <> Application.Handle) and IsWindowVisible(Wnd) and
      (GetWindow(Wnd, gw_Owner) = 0) and
      (GetWindowText(Wnd, buff, sizeof(buff)) <> 0) then begin
      GetWindowText(Wnd, buff, sizeof(buff));
      ListBox1.Items.Add(StrPas(buff));
    end;
    Wnd := GetWindow(Wnd, gw_hWndNext);
  end;
  ListBox1.ItemIndex := 0;
end;

4. Как скопировать выполняемую прогу (самокопирование)?

CopyFile( paramstr(0) ,'E:\DDD\Proga2.exe',False);

5. Как выполнить дргую прогу и дождаться конца ее выполнения?

procedure Start;
var
  si: TStartupInfo;
  p:  TProcessInformation;
begin
  FillChar(Si,SizeOf(Si),0);
  with Si do begin
    cb := SizeOf( Si);
    dwFlags := startf_UseShowWindow;
    wShowWindow := 4;
  end;
  Form1.WindowState:=wsMinimized;
  Createprocess(nil,'Your_program.exe',nil,nil,false,
    Create_default_error_mode,nil,nil,si);
  Waitforsingleobject(p.hProcess,infinite);
  Form1.WindowState:=wsNormal;
end;

6. Как выполнить дргую прогу и дождаться конца ее выполнения? (вариант 2)

procedure TForm1.BtnArchClick(Sender: TObject);
var
  lpApplicationName   : PChar;
  lpCommandLine       : PChar;
  lpThreadAttributes,
  lpProcessAttributes : PSECURITYATTRIBUTES;
  bInheritHandles     : BOOL;
  dwCreationFlags     : DWORD;
  lpEnvironment       : Pointer;
  lpCurrentDirectory  : PChar;
  lpStartupInfo       : TSTARTUPINFO;
  lpProcessInformation: TPROCESSINFORMATION;
  lpExitCode          : DWORD;
  hProcess            : THandle;

begin
  lpApplicationName   := NIL;
  lpCommandLine       := 'arj.exe a dbf *.dbf';
  lpThreadAttributes  := NIL;
  lpProcessAttributes := NIL;
  bInheritHandles     := true;
  dwCreationFlags     := NORMAL_PRIORITY_CLASS;
  lpEnvironment       := NIL;
  lpCurrentDirectory  := NIL;
  with lpStartupInfo do begin
    cb              := SizeOf(TStartupInfo);
    lpReserved      := NIL;
    lpDesktop       := NIL;
    lpTitle         := PChar('Archiving');
    dwX             := 0;
    dwY             := 0;
    dwXSize         := 0;
    dwYSize         := 0;
    dwXCountChars   := 0;
    dwYCountChars   := 0;
    dwFillAttribute := 0;
    dwFlags         := 0;
    wShowWindow     := SW_SHOWDEFAULT;
    cbReserved2     := 0;
    lpReserved2     := NIL;
    hStdInput       := 0;
    hStdOutput      := 0;
    hStdError       := 0;
  end;
  if (not CreateProcess(lpApplicationName,lpCommandLine,
             lpProcessAttributes,lpThreadAttributes,bInheritHandles,
             dwCreationFlags,lpEnvironment,lpCurrentDirectory,
             lpStartupInfo,lpProcessInformation)) then begin
     Application.MessageBox('          ERROR          ',
               'WARNING!!!',ID_OK);
   end;
   hProcess := lpProcessInformation.hProcess;
   repeat
     GetExitCodeProcess(hProcess,lpExitCode);
     Application.ProcessMessages;
   until (lpExitCode <> STILL_ACTIVE); //Waiting for enclosure
end;

Типа ВСЕ !!!.....?