Jak zamknac program

wesoledi

Trzeba znac uchwyt glownego okienka programu, a najlepiej cale info o procesie programu, tutaj pokazalem jak uruchomic program pod delphi i jak go zamknac.

Do listy uses dodaj nastepujaca wartosc: Registry

Potem wklej nastepujace zmienne i funkcje:

var
   aProcessInfo: PROCESS_INFORMATION;
   aProcessSecAttr: SECURITY_ATTRIBUTES;
   aThreadSecAttr: SECURITY_ATTRIBUTES;
   aStartupInfo: STARTUPINFO;
   hProcessHandle:HWND;

function RunApp(commandLine: string): integer;
var
   n: Boolean;
begin
   with aProcessSecAttr do
   begin
      bInheritHandle := False;
      lpSecurityDescriptor := nil;
      nLength := sizeOf(aProcessSecAttr);
   end;

   with aThreadSecAttr do
   begin
      bInheritHandle := False;
      lpSecurityDescriptor := nil;
      nLength := sizeOf(aThreadSecAttr);
   end;

   with aStartupInfo do
   begin
      cb := sizeOf(aStartupInfo);
      lpReserved := nil;
      lpDesktop := nil;
      lpTitle := nil;
      dwX := 0;
      dwY := 0;
      dwXSize := 300;
      dwYSize := 300;
      dwXCountChars := 80;
      dwYCountChars := 25;
      dwFillAttribute := 0;
      dwFlags := STARTF_USESTDHANDLES;
      wShowWindow := SW_SHOWDEFAULT;
      cbReserved2 := 0;
      lpReserved2 := nil;
      hStdInput := 0;
      hStdError := 0;
      hStdOutput := 0;
   end;

   n := CreateProcess(nil, @commandLine[1], nil, nil,
                              True, CREATE_NO_WINDOW + NORMAL_PRIORITY_CLASS,
                              nil, nil, aStartupInfo, aProcessInfo);

   if n then
      RunApp := aProcessInfo.hProcess
   else
      RunApp := -1;
end;

procedure CloseProcessHandles;
begin
   terminateprocess(aProcessInfo.hThread,0);
   terminateprocess(aProcessInfo.hProcess,0);
   CloseHandle(aProcessInfo.hThread);
   CloseHandle(aProcessInfo.hProcess);
end;

Oto przyklad ich uzycia.

procedure TForm1.Button1Click(Sender: TObject);
begin
   hProcessHandle := RunApp(extractfilepath(application.exename)+'notepad.exe');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
   CloseProcessHandles;
end; 


mozna tez prosciej:
var
   H:Thandle
begin
   H:=FindWindow(nil,'Caption Okna do zamknięcia');
   PostMessage(H,WM_QUIT,0,0);
end;
{kodzik od Endrju}

12 komentarzy

heh :D brak mi słów... to tak też sie da? hehe, jednak tak samo jak przedmówcy - zostanę przy starym dobrym close; :D

do majstra johans2:
yyy... ee... pokombinuj człowieku, poszukaj coś w stylu "zakańczanie procesów".. :/ kurcze delphi na psy schodzi... jak chcesz to napisze ci arta jak pokazać komunikat :D

a zgaszę tym firewalla???

wow moj kodzik powiadasz :)

tak tylko jak tym close zamkniesz inny program?

Ja wybieram jednak close;

Można użyć
close;
albo
Aplication.Terminate;
tak jest prościej

buhahaha! gratuluje pomysłu :D

A za tydzień - jak nacisnąc button w 10 rozdzialach :D

jak można tak prosto to po co ten długi kod ?? Jest kilka prostrzych sposobó na uzyskanie tego samego efektu....

Na przyszłość stosuj polskie litery, komentarze, znaczki formatowania kodu, opisuj dokładniej temat wskazówki. Przeczytaj najelepiej: [url]http://4programmers.net/coyote/coyote.html#10[/url]

Tam jest napisane wszystko, co powinieneś wiedzieć na temat dodawania artykułów w serwisie.

[quote]mozna tez prosciej:
...[/quote]
no to poco ten 5x dłuższy sposób ? :/

i temat bezsensowny.. "jak zamknac program" jaki gdzie jak czym?

Brak polskich liter!! W artukułach przestrzegamy tego!

Brak ładnego formatowania kodu - wcięcia i tag <delphi>