PDA

Ver la Versión Completa : Controlar ShellExecute


javier14
09-01-2024, 12:30:40
¿ 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.



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 ^\||/