Compago

...free knowledge

 
  • Increase font size
  • Default font size
  • Decrease font size
Home Manuali Programmazione Terminare un processo

Terminare un processo

E-mail Stampa PDF

Di seguito verranno inserite le funzioni in Delphi che permettono di terminare un processo usando il suo nome oppure usando l'identificativo della sua finestra.

uses
  ...
  TLHelp32,
  ...
 
function KillProcess(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);
  //Inizia dal primo processo a percorrere la lista dei processi in esecuzione
  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
   KillProcess('notepad.exe');
end;

Terminare un processo usando l'handle della sua finestra:

procedure KillProcess(hWindowHandle: HWND);
var
  hprocessID: INTEGER;
  processHandle: THandle;
  DWResult: DWORD;
begin
  //Prova a chiudere la finestra dell'applicazione inviandole un messaggio WM_CLOSE
  SendMessageTimeout(hWindowHandle, WM_CLOSE, 0, 0,SMTO_ABORTIFHUNG or SMTO_NORMAL, 5000, DWResult);
 
  //Se non si riuscisse a chiudere la finestra, cerca e termina il processo relativo ad essa.
  if isWindow(hWindowHandle) then begin
    PostMessage(hWindowHandle, WM_QUIT, 0, 0);
    // Trova l'identificativo del processo relativo alla finestra dell'applicazione
    GetWindowThreadProcessID(hWindowHandle, @hprocessID);
    if hprocessID <> 0 then begin
      // Recupera il process handle
      processHandle := OpenProcess(PROCESS_TERMINATE or PROCESS_QUERY_INFORMATION, False, hprocessID);
      if processHandle <> 0 then begin
        // Termina il processo 
        TerminateProcess(processHandle, 0);
        CloseHandle(ProcessHandle);
      end;
    end;
  end;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
   KillProcess(FindWindow('notepad',nil));
end;
Ultimo aggiornamento ( Lunedì 13 Dicembre 2010 12:24 )  
Loading

Login