Saber si una aplicación está en ejecución

3374 vistas

Para encontrar el nombre de la aplicación en ejecución usaremos la función CreateToolhelp32Snapshot que nos devolverá la lista de procesos en curso. Una vez obtenida, recorreremos la lista usando la función Process32Next que devuelve la información de un proceso en un registro de tipo TProcessentry32:



delphi
  1. tagPROCESSENTRY32 = packed record
  2.     dwSize: DWORD;              // tamaño del registro
  3.     cntUsage: DWORD;            // contador de referencia de proceso, si es cero el proceso temina
  4.     th32ProcessID: DWORD;        // identificador del proceso
  5.     th32DefaultHeapID: DWORD;    // identificador de la pila por defecto del proceso
  6.     th32ModuleID: DWORD;        // identificador del modelo de proceso
  7.     cntThreads: DWORD;          // numero de hilos del proceso
  8.     th32ParentProcessID: DWORD;  // identificador del proceso padre (su "creador")
  9.     pcPriClassBase: Longint;    // prioridad base de los hilos creados por el proceso
  10.     dwFlags: DWORD;              // reservado
  11.     szExeFile: array[0..MAX_PATH - 1] of Char; // nombre del ejecutable
  12.   end;



Tendremos que añadir en el uses la unidad TLHelp32.



delphi
  1. uses TLHelp32;
  2.  
  3. ..... 
  4.  
  5. // 'StopProcess' indica si tenemos que terminar la oplicación 'NameApplication'
  6. function ExeRunning(NameApplication: string; StopProcess: Boolean): Boolean;
  7. var
  8.   ProcListExec: TProcessentry32;
  9.   PrhListExec: Thandle;
  10.   Continuar: Boolean;
  11.   isStarted: Boolean;
  12.   HandleProcessEnCurso: Cardinal;
  13.   PathProcessEnCurso: string;
  14.   ProcessEnCurso: string;
  15. begin
  16.   // lista de las aplicaciones en curso
  17.   // inicialización de variables y recuperación de la lista de procesos
  18.   ProcListExec.dwSize:=sizeof(ProcListExec);
  19.   Continuar := True;
  20.   isStarted := False;
  21.  
  22.   Try
  23.     // recuperamos la lista de procesos en ejecución en el momento de la llamada
  24.     PrhListExec := CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
  25.     if (PrhListExec <> INVALID_HANDLE_VALUE) then
  26.     begin
  27.       // nos posicionamos en el primer proceso
  28.       Process32First(PrhListExec, ProcListExec);
  29.  
  30.       // mientra que no encontremos el programa buscado y queden aun en la lista, la recorremos
  31.       while Continuar do
  32.       begin
  33.         ProcessEnCurso := Uppercase(ExtractFileName(ProcListExec.szExeFile));
  34.         ProcessEnCurso := ChangeFileExt(ProcessEnCurso, '');
  35.         isStarted := (ProcessEnCurso = Uppercase(NameApplication));
  36.         if isStarted then
  37.         begin
  38.           HandleProcessEnCurso := ProcListExec.th32ProcessID;
  39.           PathProcessEnCurso := ExtractFilepath(ProcListExec.szExeFile);
  40.           Continuar := False;
  41.         end
  42.         else // buscamos el proceso siguiente de la lista
  43.           Continuar := Process32Next(PrhListExec, ProcListExec);
  44.       end;
  45.  
  46.       if StopProcess then
  47.         if isStarted then
  48.         begin  // terminamos el proceso indicando el código de salida 0
  49.           TerminateProcess(OpenProcess(PROCESS_TERMINATE, False, HandleProcessEnCurso), 0);
  50.           Sleep(500); // dejamos un tiempo al proceso para que se termine
  51.         end;
  52.     end;
  53.   Finally
  54.     CloseHandle(PrhListExec); // liberamos los recursos
  55.     Result := isStarted;
  56.   end;
  57. end;