Saber si una aplicación está ejecutándose es fácil utilizando FindWindow siempre que sepamos o bien su nombre de aplicación o bien su nombre de clase. Pero si tan sólo sabemos el nombre del ejecutable... este truco puede sernos de ayuda
procedure TForm1.Button1Click(Sender: TObject);
function EstaEjecutandose (ExeFile:string): boolean;
var H:word;
begin
H := CreateFile(PChar(ExeFile), GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
Result := (H >= 65535);
CloseHandle(H);
end;
begin
If EstaEjecutandose ('c:\windows\notepad.exe')
then Label1.Caption:='SI/YES'
else Label1.Caption:='NO';
end;
|
La función devolverá TRUE si el EXE está en ejecución.
El método anterior se basa en comprobar si podemos o no abrir el EXE con derecho de escritura, ya que si está siendo ejecutado, el EXE queda bloqueado por Windows. Esto está bien, pero no nos dá seguridad de que el EXE esté efectivamente en ejecución... por ejemplo, podría estar siendo ejecutado por otro ordenador en red...
Aqui tienes otro método un poco más complicado pero fiable para saber si está siendo o no ejecutado un EXE conociendo su nombre:
Añade 'TLHelp32' en el uses de tu form
El siguiente ejemplo, testeará si el Notepad está siendo ejecutado o no. (Ojo con el path del Notepad, el ejemplo asume que el Notepad está en C:\WINDOWS\NOTEPAD.EXE)
procedure TForm1.Button1Click(Sender: TObject);
function IsRunnig (FicheroExe:string):boolean;
function SacaExe(MangoW:HWND):string;
{Obtiene el EXE de una tarea}
{get EXE of a task}
var
Datos :TProcessEntry32;
hID :DWord;
Snap : Integer;
begin
GetWindowThreadProcessId(MangoW,@hID);
Snap:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
try
Datos.dwSize:=SizeOf(Datos);
if(Process32First(Snap,Datos))then
begin
repeat
if Datos.th32ProcessID=hID then
begin
Result:=StrPas(Datos.szExeFile);
Break;
end;
until not(Process32Next(Snap,Datos));
end;
finally
Windows.CloseHandle(Snap);
end;
end;
function ObtieneVentanas(Mango: HWND;
ACerrar: Pointer): Boolean; stdcall;
begin
Result := True;
{Mango es el handle de la tarea encontrada}
{Si es el .EXE buscado, lo cierra}
if SacaExe(Mango)=UpperCase( String(ACerrar^) )then
begin
String(Acerrar^):='Encontrado';
end;
end;
begin
EnumWindows( @ObtieneVentanas, Integer(@FicheroExe) );
Result:=(FicheroExe='Encontrado');
end;
begin
if IsRunnig('C:\WINDOWS\NOTEPAD.EXE')
then ShowMessage ('Ejecutandose/Running')
else ShowMessage ('No Ejecutandose/Do not running');
end;
|
Actualizado el 21/09/99
Añadido el segundo método
|