Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Saber si una aplicación se está ejecutando (https://www.clubdelphi.com/foros/showthread.php?t=16026)

Javi2 12-11-2004 09:12:14

Saber si una aplicación se está ejecutando
 
Hola, estoy desarrollando una pequeña aplicación en Delphi y me gustaría que, al iniciar la aplicación, compruebe si ésta ya está siendo ejecutada y si ya está en marcha que muestre un mensaje.

Muchas gracias.

Er_Manué 12-11-2004 09:29:27

Truco 267 de Trucomania, antes, debes de incluir la libreria TLHelp32

Código:

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;

salu2

carlos7 12-11-2004 09:31:19

Hola, simplemente tienes que poner el siguiente código en el fichero dpr, justo antes del Application.Initialize :

Const
NombreMutex='Un Nombre Cualquiera';
Var
MiMutex:THandle;
Imagen,ImagenSel : TBitmap;
begin
Mimutex:=CreateMutex(Nil,True,NombreMutex);
If MiMutex=0 Then
Begin
Showmessage('Error creando Mutex');
Halt;
End;
If GetLastError=ERROR_ALREADY_EXISTS Then
Begin
ShowMessage('El programa YA está funcionando.');
Halt;
End;


Saludos.
Carlos

Javi2 12-11-2004 11:28:41

Muchas gracias a todos

roman 12-11-2004 16:34:07

Si además quieres que la instancia ya existente de tu aplicación se active en lugar de sólo mandar un mensaje al usuario, te ofrezco la unidad uiapp.pas en mi página. Con esta unidad tú no tienes que programar nada, únicamente incluirla en la cláusula uses de tu archivo dpr.

// Saludos

darkone2k3 12-11-2004 17:15:01

Cita:

Empezado por roman
Si además quieres que la instancia ya existente de tu aplicación se active en lugar de sólo mandar un mensaje al usuario, te ofrezco la unidad uiapp.pas en mi página. Con esta unidad tú no tienes que programar nada, únicamente incluirla en la cláusula uses de tu archivo dpr.

// Saludos

Muxas gracias x la unidad q ofreces, acabo de probarla y me funcionó muy bien, gracias! :D

edgusano 13-11-2004 18:19:09

Esa Unidad de Roman es de lo mejor. Es mas te agradezco mucho, en la aplicacion de mi tesis de grado quedaste presente con esa unit:D.

Migmam2 03-03-2008 12:45:01

Cita:

Empezado por carlos7 (Mensaje 69115)
Hola, simplemente tienes que poner el siguiente código en el fichero dpr, justo antes del Application.Initialize :

Const
NombreMutex='Un Nombre Cualquiera';
Var
MiMutex:THandle;
Imagen,ImagenSel : TBitmap;
begin
Mimutex:=CreateMutex(Nil,True,NombreMutex);
If MiMutex=0 Then
Begin
Showmessage('Error creando Mutex');
Halt;
End;
If GetLastError=ERROR_ALREADY_EXISTS Then
Begin
ShowMessage('El programa YA está funcionando.');
Halt;
End;


Saludos.
Carlos

Para utilizar este código poner en el Uses la unidad Windows.
Una duda que me queda es saber para que sirve Imagen,ImagenSel : TBitmap;

Saludos,

Miguel Angel

ramflores 10-05-2012 20:00:08

hola.
Me marca error al tratar de entrar al Link del UIApp

gracias de antemano

Cita:

Empezado por roman (Mensaje 69160)
Si además quieres que la instancia ya existente de tu aplicación se active en lugar de sólo mandar un mensaje al usuario, te ofrezco la unidad uiapp.pas en mi página. Con esta unidad tú no tienes que programar nada, únicamente incluirla en la cláusula uses de tu archivo dpr.

// Saludos


charyperez 28-08-2018 14:37:09

Saber si una aplicación se está ejecutando
 
Buenos dias,

Soy nueva en el foro, pero llevo tiempo consultándolo.
He probado la solución que dais y me funciona perfectamente, pero mi problema es que yo tengo que ver si se está ejecutando, si es así, matar ese proceso y ejecutar el actual.
Para matar el proceso uso la llamada a un bat y lo mata, pero supongo que mata todos los procesos con el mismo nombre, porque ya no continua con el Application.Initialize.

Os pongo el código que tengo para ver si me podeis ayudar.


Const
NombreMutex='Mabisy';
Var
MiMutex:THandle;


begin



Mimutex:=CreateMutex(Nil,True,NombreMutex);

If MiMutex=0 Then
Begin
Showmessage('Error creando Mutex');
Halt;
End;
If GetLastError=ERROR_ALREADY_EXISTS Then
Begin
ShowMessage('El programa YA está funcionando.');
ShellExecute(0,nil,PChar('C:\delphi\Matarproceso.bat'),'','',SW_HIDE);
End;

Application.Initialize;

Application.CreateForm(TdmMBYControl, dmMBYControl);



El código del bat es simplemente :

taskkill /Im Proceso.exe

Gracias

Casimiro Notevi 28-08-2018 19:13:20

Bienvenida a clubdelphi, como siempre aconsejamos a los nuevos, no olvides leer nuestra guía de estilo, gracias por tu colaboración :)

Recuerda poner los tags al código fuente, ejemplo:



Gracias :)

Deberías haber creado un nuevo hilo ya que no vas a aportar nada a la solución de este, que es de hace 14 años.
Saludos.

charyperez 29-08-2018 08:17:33

Saber si una aplicación se está ejecutando
 
Gracias Casimiro.
Pero no veo como crear un nuevo hilo. ¿Me lo podrias explicar?

Casimiro Notevi 29-08-2018 10:34:38

Seleccionas el foro adecuado, o "Varios" si no sabes dónde ponerlo, le das al botón "Nuevo hilo" que está arriba/izquierda, pones un título lo más descriptivo posible... y escribes el mensaje.
Saludos.

Armando Montiel 18-07-2019 20:36:57

Cita:

Empezado por darkone2k3 (Mensaje 69171)
Muxas gracias x la unidad q ofreces, acabo de probarla y me funcionó muy bien, gracias! :D

Ya no está disponible???

Casimiro Notevi 18-07-2019 21:19:40

Aquí tienes el código:
Código Delphi [-]
unit UIApp;

interface

implementation

uses
  Windows, SysUtils, Forms;

const
  { Cadenas para registrar el mutex y el mensaje }
  sMutex   = '5EF83655-5902-48D0-AC23-BF3C3B0610F9';
  sActivar = '95C30256-F47E-4E23-87AC-9B9C67C8D0C5';

var
  mActivar    : Cardinal; { Mensaje para activar la instancia anterior }
  Mutex       : Cardinal; { Mutex                                      }
  PrevWndProc : TFarProc; { Procedimiento de ventana original          }


function AppWndProc(Handle: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LongInt; stdcall;
var
  FgThreadId  : DWORD; { Hilo de la app. que tenga el foco }
  AppThreadId : DWORD; { Hilo de nuestra aplicación        }

begin
  if Msg = mActivar then
  begin
    { Si está minimizada basta restaurarla }
    if IsIconic(Handle) then
      ShowWindow(Handle, SW_RESTORE)
    else
    begin
      { Obtener los hilos }
      FgThreadId  := GetWindowThreadProcessId(GetForegroundWindow, nil);
      AppThreadId := GetWindowThreadProcessId(Handle, nil);

      { Anexar el hilo de nuestra app. al de la  que tenga el foco }
      AttachThreadInput(AppThreadId, FgThreadId, true);

      { Ahora sí, activar la applicación }
      SetForegroundWindow(Handle);

      { Separar el hilo de nuestra app de la otra }
      AttachThreadInput(AppThreadId, FgThreadId, false);
    end;

    Result := 0;
  end
  else
    { Dejar que el procedimiento original se encargue de los otros mensajes }
    Result := CallWindowProc(PrevWndProc, Handle, Msg, wParam, lParam);
end;

procedure Activar;
begin
  { Mandamos el mensaje a todas las ventanas }
  SendMessage(HWND_BROADCAST, mActivar, 0, 0);
end;

procedure Registrar;
begin
  mActivar := RegisterWindowMessage(sActivar);
  Mutex    := CreateMutex(nil, true, sMutex);

  { Si ya existe el mutex lanzamos una excepción silenciosa }
  if GetLastError = ERROR_ALREADY_EXISTS then
  begin
   Mutex := 0;
   abort;
  end
  else
  begin
    { Sustituimos el procedimiento de ventana }
    PrevWndProc := TFarProc(GetWindowLong(Application.Handle, GWL_WNDPROC));
    SetWindowLong(Application.Handle, GWL_WNDPROC, LongWord(@AppWndProc));
  end;
end;

initialization
  try
    Registrar;
  except
    Activar;
    Halt;
  end;

finalization
  if Mutex <> 0 then ReleaseMutex(Mutex);
end.


La franja horaria es GMT +2. Ahora son las 22:31:18.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi