Saber si una aplicación está en ejecución
Artículo por Club Developers · 01 marzo 2006
3675 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:
Tendremos que añadir en el uses la unidad TLHelp32.
delphi
tagPROCESSENTRY32 = packed record dwSize: DWORD; // tamaño del registro cntUsage: DWORD; // contador de referencia de proceso, si es cero el proceso temina th32ProcessID: DWORD; // identificador del proceso th32DefaultHeapID: DWORD; // identificador de la pila por defecto del proceso th32ModuleID: DWORD; // identificador del modelo de proceso cntThreads: DWORD; // numero de hilos del proceso th32ParentProcessID: DWORD; // identificador del proceso padre (su "creador") pcPriClassBase: Longint; // prioridad base de los hilos creados por el proceso dwFlags: DWORD; // reservado szExeFile: array[0..MAX_PATH - 1] of Char; // nombre del ejecutable end;
Tendremos que añadir en el uses la unidad TLHelp32.
delphi
uses TLHelp32; ..... // 'StopProcess' indica si tenemos que terminar la oplicación 'NameApplication' function ExeRunning(NameApplication: string; StopProcess: Boolean): Boolean; var ProcListExec: TProcessentry32; PrhListExec: Thandle; Continuar: Boolean; isStarted: Boolean; HandleProcessEnCurso: Cardinal; PathProcessEnCurso: string; ProcessEnCurso: string; begin // lista de las aplicaciones en curso // inicialización de variables y recuperación de la lista de procesos ProcListExec.dwSize:=sizeof(ProcListExec); Continuar := True; isStarted := False; Try // recuperamos la lista de procesos en ejecución en el momento de la llamada PrhListExec := CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0); if (PrhListExec <> INVALID_HANDLE_VALUE) then begin // nos posicionamos en el primer proceso Process32First(PrhListExec, ProcListExec); // mientra que no encontremos el programa buscado y queden aun en la lista, la recorremos while Continuar do begin ProcessEnCurso := Uppercase(ExtractFileName(ProcListExec.szExeFile)); ProcessEnCurso := ChangeFileExt(ProcessEnCurso, ''); isStarted := (ProcessEnCurso = Uppercase(NameApplication)); if isStarted then begin HandleProcessEnCurso := ProcListExec.th32ProcessID; PathProcessEnCurso := ExtractFilepath(ProcListExec.szExeFile); Continuar := False; end else // buscamos el proceso siguiente de la lista Continuar := Process32Next(PrhListExec, ProcListExec); end; if StopProcess then if isStarted then begin // terminamos el proceso indicando el código de salida 0 TerminateProcess(OpenProcess(PROCESS_TERMINATE, False, HandleProcessEnCurso), 0); Sleep(500); // dejamos un tiempo al proceso para que se termine end; end; Finally CloseHandle(PrhListExec); // liberamos los recursos Result := isStarted; end; end;