Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-11-2004
Javi2 Javi2 is offline
Miembro
 
Registrado: jun 2004
Posts: 152
Poder: 20
Javi2 Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 12-11-2004
Er_Manué Er_Manué is offline
Miembro
 
Registrado: may 2003
Posts: 74
Poder: 21
Er_Manué Va por buen camino
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
Responder Con Cita
  #3  
Antiguo 12-11-2004
carlos7 carlos7 is offline
Miembro
 
Registrado: sep 2004
Posts: 11
Poder: 0
carlos7 Va por buen camino
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
Responder Con Cita
  #4  
Antiguo 12-11-2004
Javi2 Javi2 is offline
Miembro
 
Registrado: jun 2004
Posts: 152
Poder: 20
Javi2 Va por buen camino
Muchas gracias a todos
Responder Con Cita
  #5  
Antiguo 12-11-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #6  
Antiguo 12-11-2004
darkone2k3 darkone2k3 is offline
Miembro
 
Registrado: oct 2003
Ubicación: Frente al Computador.
Posts: 29
Poder: 0
darkone2k3 Va por buen camino
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!
Responder Con Cita
  #7  
Antiguo 13-11-2004
Avatar de edgusano
edgusano edgusano is offline
Miembro
 
Registrado: abr 2004
Ubicación: Medellin Colombia
Posts: 180
Poder: 20
edgusano Va por buen camino
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.
__________________
Optimus Prime
Responder Con Cita
  #8  
Antiguo 03-03-2008
Migmam2 Migmam2 is offline
Miembro
 
Registrado: jul 2006
Posts: 18
Poder: 0
Migmam2 Va por buen camino
Cita:
Empezado por carlos7 Ver Mensaje
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
Responder Con Cita
  #9  
Antiguo 10-05-2012
Avatar de ramflores
ramflores ramflores is offline
Miembro
 
Registrado: may 2005
Ubicación: Monterrey, Mex.
Posts: 87
Poder: 19
ramflores Va por buen camino
hola.
Me marca error al tratar de entrar al Link del UIApp

gracias de antemano

Cita:
Empezado por roman Ver Mensaje
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
__________________
Gracias de antemano
Saludos ........
---------------------------------
Ramiro Flores
Responder Con Cita
  #10  
Antiguo 28-08-2018
charyperez charyperez is offline
Registrado
NULL
 
Registrado: dic 2012
Posts: 2
Poder: 0
charyperez Va por buen camino
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
Responder Con Cita
  #11  
Antiguo 28-08-2018
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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.
Responder Con Cita
  #12  
Antiguo 29-08-2018
charyperez charyperez is offline
Registrado
NULL
 
Registrado: dic 2012
Posts: 2
Poder: 0
charyperez Va por buen camino
Saber si una aplicación se está ejecutando

Gracias Casimiro.
Pero no veo como crear un nuevo hilo. ¿Me lo podrias explicar?
Responder Con Cita
  #13  
Antiguo 29-08-2018
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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.
Responder Con Cita
  #14  
Antiguo 18-07-2019
Armando Montiel Armando Montiel is offline
Registrado
 
Registrado: nov 2018
Posts: 4
Poder: 0
Armando Montiel Va por buen camino
Cita:
Empezado por darkone2k3 Ver Mensaje
Muxas gracias x la unidad q ofreces, acabo de probarla y me funcionó muy bien, gracias!
Ya no está disponible???
Responder Con Cita
  #15  
Antiguo 18-07-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 18:07:08.


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
Copyright 1996-2007 Club Delphi