Saber si un .EXE está ejecutándose  

Enviado Por: Q3 Team
Web : http://www.q3.nu
Email: dlib@q3.nu
Fecha: 22/01/00

Truco accedido 104 veces

 


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