Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Abrir aplicacion 1 vez (https://www.clubdelphi.com/foros/showthread.php?t=73887)

kdemia 23-05-2011 01:52:39

Abrir aplicacion 1 vez
 
que tal gente, no encontre esto por ningun lado :S queria saber como puedo hacer para limitar al usuario a que ejecute una sola vez a la vez (valga la redundancia) mi aplicacion, que por ejemplo si quieren ejecutar mi programa, y este ya esta abierto, que se ponga en foco el programa abierto, no que se abra uno nuevo.. muchas gracias..

radenf 23-05-2011 02:03:18

Estimado kdemia :

Puedes utilizar el truco 582 que lo encuentras en la página de inicio del Club Delphi, en la sección Trucos o bien el componente TmxOneInstance de MaxComponents, que lo encuentras en la FTP del Club.

Saludos y ojalá haya podido ayudarte

kdemia 23-05-2011 02:11:16

genial radenf.. me sirvio muchisimo.. gracias.

radenf 23-05-2011 02:54:29

Encantado de haberte podido ayudar.

Saludos

kdemia 23-05-2011 02:57:28

no puedo instalar el TmxOneInstance en delphi 2010 :S

Spynosa 23-05-2011 10:06:55

poniendo esta unit en el uses ya lo tienes

Código Delphi [-]
unit UIApp;

interface

implementation

uses
  Windows, SysUtils, Forms;

const
  { Cadenas para registrar el mutex y el mensaje }
  sMutex   = '0C861247-3FA9-4C82-9E0E-15696E0857BC';
  sActivar = '83F47A0F-7B00-49FB-9F67-A9E1D4AD2B93';

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.


siento no acordarme de donde la saque, mia no es

un saludo

Neftali [Germán.Estévez] 23-05-2011 11:55:03

Cita:

Empezado por Spynosa (Mensaje 400936)
siento no acordarme de donde la saque, mia no es

Pues es de la Web de Román, el problema es que a día de hoy está "caída" o el dominio ha caducado.

Spynosa 23-05-2011 13:29:20

gracias Neftali, ya no me acordaba, pero funciona perfectamente

roman 23-05-2011 16:25:00

Cita:

Empezado por Neftali (Mensaje 400943)
Pues es de la Web de Román, el problema es que a día de hoy está "caída" o el dominio ha caducado.

¿No les avisé de la restauración? :o

http://roman.clubdelphi.com/

Aunque bueno, casi es lo mismo que estar caída :D pues hace años que no pongo nada je, je.

// Saludos

rretamar 23-05-2011 16:34:17

Si no te querés complicar la vida, dentro del paquete de componentes libres JEDI hay uno que hace exactamente lo que pides, con algunas interesantes propiedades para personalizarlo.

Muy recomendado.

http://jvcl.delphi-jedi.org

Neftali [Germán.Estévez] 23-05-2011 17:07:39

Cita:

Empezado por roman (Mensaje 400962)
¿No les avisé de la restauración? :o

nop. :D

¿La dirección sigue siendo la misma que hay aquí?

roman 23-05-2011 17:14:04

Cita:

Empezado por Neftali (Mensaje 400965)
nop. :D

¿La dirección sigue siendo la misma que hay aquí?

Ja, ja. Supongo que no :D Habrá que cambiar eso, me he estado perdiendo cientos de mails de mis fans :D

// Saludos

Neftali [Germán.Estévez] 23-05-2011 17:16:39

Cita:

Empezado por roman (Mensaje 400966)
Ja, ja. Supongo que no...

Me lo imaginaba... ;)

BlueSteel 23-05-2011 17:58:30

Cita:

Empezado por rretamar (Mensaje 400963)
Si no te querés complicar la vida, dentro del paquete de componentes libres JEDI hay uno que hace exactamente lo que pides, con algunas interesantes propiedades para personalizarlo.

Muy recomendado.

http://jvcl.delphi-jedi.org


y que componente es, o de que paleta es la que se utiliza para esto... mira que la tengo instalada y aún no se para que sirve cada uno de ellos....:D:D:D

kdemia 23-05-2011 18:07:56

nunca me imagine tantos mails de parte de club delphi en una pregunta mia :P jajaja muchas gracias por la unidad la voy a probar esta noche y les comento.. tmb voy a probar los componentes JEDI.. y por cierto, roman te felicito por esa pagina no la conocia terriblemente util.. un abrazo a todos

kdemia 23-05-2011 18:34:47

roman tu unidad la baje de tu pagina y funciona perfectamente :D el tema es que genera procesos nuevos osea como que se abre pero no se muestra.. si yo lo abro 10 veces, en los procesos del administrador de tareas aparece 10 veces, pero en el escritorio me lo muestra 1 vez es raro :P, y es como q cuando lo abro por segunda o mas veces como que tarda.. pero bueno a eso no le doy mucha bola, me interesa mas lo de los procesos.. se puede solucionar?

roman 23-05-2011 18:42:25

Pues entonces no funciona "perfectamente". Desde luego, no debe hacer eso. Esa unidad la hice para delphi 7 y windows xp y me parece que en nuevas versiones tiene algunas fallas, pero no las he revisado pues hace mucho que ya casi no programo en delphi.

¿Qué versiones usas?

// Saludos

kdemia 23-05-2011 21:48:52

delphi 2010 y windows 7 .. :/

Spynosa 26-05-2011 10:26:00

con delphi 7 y windows 7 funciona perfectamente debe ser cosa de delphi 2010

roman 26-05-2011 16:44:55

Yo probé con Delphi XE y Windows Vista y tampoco tuve problemas. Claro, en la lista de procesos, el nuevo proceso aparece listado temporalmente, pues sí existe, y desaparece apenas termina. Se me hace extraño el comportamiento que menciona kdemia, pues la técnica usada (semáforos) no creo que haya cambiado en Windows 7.

// Saludos


La franja horaria es GMT +2. Ahora son las 22:20:42.

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