Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Controlar ShellExecute (https://www.clubdelphi.com/foros/showthread.php?t=96559)

javier14 09-01-2024 12:30:40

Controlar ShellExecute
 
¿ Cómo puedo comprobar si el archivo que se abre con un ShellExecute ya se ha abierto y poder hacer un Application.Terminate a mi programa ?

Casimiro Notevi 09-01-2024 13:53:32

Esperando a que shellexecute termine.
Mira los enlaces de abajo, es un tema tratado muchas veces.
Avisa si no lo encuentras.

pgranados 09-01-2024 15:34:59

Yo utilizo este código para cerrar una aplicación con el administrador de tareas de Windows. Puedes modificarlo para verificar si el exe ya esta abierto.


Código Delphi [-]
procedure TerminateProcessByName(const ProcessName: string);// Aqui le pasas el nombre del exe que vas a verificar si esta abierto: MiApp.exe
var
  ProcessID: DWORD;
  hProcess: THandle;
  ExitCode: DWORD;
begin
  // Obtener el ID del proceso por su nombre
  ProcessID := GetProcessIDByName(ProcessName); 
  if ProcessID <> 0 then
  begin
     // Aqui ya sabemos que app esta abierta, pero si quieres cerrar el exe que le mandaste a la funcion puedes usar el codigo de abajo
    {
    // Obtener el handle del proceso
    hProcess := OpenProcess(PROCESS_TERMINATE, False, ProcessID);
    Application.ProcessMessages;
    if hProcess <> 0 then
    begin
      TerminateProcess(hProcess, 0);
      CloseHandle(hProcess);
    end;}
  end;
end;


function GetProcessIDByName(const ProcessName: string): DWORD;
var
  SnapshotHandle: THandle;
  ProcessEntry32: TProcessEntry32;
begin
  Result := 0;
  SnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if SnapshotHandle <> INVALID_HANDLE_VALUE then
  begin
    ProcessEntry32.dwSize := SizeOf(ProcessEntry32);
    if Process32First(SnapshotHandle, ProcessEntry32) then
    begin
      while Process32Next(SnapshotHandle, ProcessEntry32) do
      begin
        if SameText(ExtractFileName(ProcessEntry32.szExeFile), ProcessName) then
        begin
          Result := ProcessEntry32.th32ProcessID;
          Break;
        end;
      end;
    end;
    CloseHandle(SnapshotHandle);
  end;
end;

Lo probe en Windows 10 y 11 y funciona perfecto ^\||/


La franja horaria es GMT +2. Ahora son las 01:02:57.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi