[ort!] procesów

0

Witam.
Czy jest jakiś prosty sposób na to, aby zakończyć dany proces? Próbowałem tak:
WinExec('TASKKILL explorer.exe'); ale jakoś nie działało, a poza tym nie o takie zamykanie mi chodzi. Na innym forum znalazłem takie rozwiązanie, lecz coś nie mogę go wykonać:

jak znasz klase:

function  KillProc(const ClassName:AnsiString):Boolean;
var
 hWnd,hProc:THandle;
 pid:DWORD;

begin
 Result:=False;
 hWnd := FindWindow(PCHAR(ClassName),nil);
 if IsWindow(hWnd) then begin
   GetWindowThreadProcessId(hWnd, @pid);
   hproc := OpenProcess(PROCESS_TERMINATE, FALSE, pid);
   if hproc<>0 then begin
     Result:=TerminateProcess(hProc,0);
     if Result then CloseHandle(hProc);
   end;
 end;
end;

KillProc('NOTEPAD');

# ścieżkę

uses TLHelp32;

var
 PHandle, FHandle: THandle;
 Process:TProcessEntry32;
 Done, Next: Boolean;
 EXE : String; // ścieżka programu
begin
 EXE := 'C:\Windows\Pulpit\prog.exe';
 FHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
 Process.dwSize := Sizeof(Process);
 Next := Process32First(FHandle,Process);
 while Next do
 begin{ jesli sciezka dostepu sie zgadza }
   if AnsiLowerCase(Process.szExeFile) = AnsiLowerCase(EXE) then
   begin
    PHandle:=OpenProcess(PROCESS_TERMINATE, False,
    Process.th32ProcessID);
    { to probujemy zabic aplikacje }
    Done := TerminateProcess(PHandle,0);
    if not Done then
      MessageBox(Handle, 'Błąd', 'Błąd', MB_OK);
    end;
   Next := Process32Next(FHandle,Process);
  end;
  CloseHandle(FHandle);
end;

# caption

var
 H:Thandle;
begin
 H:=FindWindow(nil,'Caption Okna do zamknięcia');
 PostMessage(H,WM_QUIT,0,0);
end;

I chodzi o to, że nie chodzi, i poza tym ta metoda jast jakoś bardzo skomplikowana.
Proszę i z góry dziękuję za odpowiedź, pozdrawiam, gonet9

0
uses TlHelp32,

//Zabicie wybranego 
//podawać nazwę programu z rozszerzeniem ale bez pełnej ścieżki dostępu
function KillTask(ExeFileName: string): Integer;
const
 PROCESS_TERMINATE = $0001;
var
 ContinueLoop    :BOOL;
 FSnapshotHandle :THandle;
 FProcessEntry32 :TProcessEntry32;
begin
 Result:= 0;
 FSnapshotHandle:= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 FProcessEntry32.dwSize:= Sizeof(FProcessEntry32);
 ContinueLoop:= Process32First(FSnapshotHandle, FProcessEntry32);
 while Integer(ContinueLoop) <> 0 do
 begin
   if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExeFileName))
       or (UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeFileName))) then
         Result:= Integer(TerminateProcess(OpenProcess(
                          PROCESS_TERMINATE, BOOL(0),
                          FProcessEntry32.th32ProcessID), 0));
   ContinueLoop:= Process32Next(FSnapshotHandle, FProcessEntry32);
   end;
end; 

//lub z podaniem pełnej ścieżki...
procedure Tform1.zabij(jaki:string);
var
 PHandle, FHandle: THandle;
 Process:TProcessEntry32;
 Done, Next: Boolean;
begin
 FHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
 Process.dwSize := Sizeof(Process);
 Next := Process32First(FHandle,Process);
 while Next do
 begin
  if AnsiLowerCase(Process.szExeFile) = AnsiLowerCase(jaki) then
  begin
   PHandle:=OpenProcess(PROCESS_TERMINATE, False,
   Process.th32ProcessID);
   Done := TerminateProcess(PHandle,0);
   if not Done then
    MessageBox(Handle, 'Błąd', 'Błąd', MB_OK);
   end;
  Next := Process32Next(FHandle,Process);
  end;
  CloseHandle(FHandle);
end;

For Windows 9x/ME/2000/XP }

uses
  Tlhelp32;

function KillTask(ExeFileName: string): Integer;
const
  PROCESS_TERMINATE = $0001;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
begin
  Result := 0;
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);

  while Integer(ContinueLoop) <> 0 do
  begin
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
      UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
      UpperCase(ExeFileName))) then
      Result := Integer(TerminateProcess(
                        OpenProcess(PROCESS_TERMINATE,
                                    BOOL(0),
                                    FProcessEntry32.th32ProcessID),
                                    0));
     ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  KillTask('notepad.exe');
end;

{ For Windows NT/2000/XP }

procedure KillProcess(hWindowHandle: HWND);
var
  hprocessID: INTEGER;
  processHandle: THandle;
  DWResult: DWORD;
begin
  SendMessageTimeout(hWindowHandle, WM_CLOSE, 0, 0,
    SMTO_ABORTIFHUNG or SMTO_NORMAL, 5000, DWResult);

  if isWindow(hWindowHandle) then
  begin
    // PostMessage(hWindowHandle, WM_QUIT, 0, 0);

    { Get the process identifier for the window}
    GetWindowThreadProcessID(hWindowHandle, @hprocessID);
    if hprocessID <> 0 then
    begin
      { Get the process handle }
      processHandle := OpenProcess(PROCESS_TERMINATE or PROCESS_QUERY_INFORMATION,
        False, hprocessID);
      if processHandle <> 0 then
      begin
        { Terminate the process }
        TerminateProcess(processHandle, 0);
        CloseHandle(ProcessHandle);
      end;
    end;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  KillProcess(FindWindow('notepad',nil));
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0