Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Abrir el programa solo una vez (https://www.clubdelphi.com/foros/showthread.php?t=54985)

Paulao 04-04-2008 17:44:55

Abrir el programa solo una vez
 
Hizo este codigo, pero no estas funcionando. Siempre viene el mensaje que ya tiene una aplicación rodando. Como hago para no permitir que la aplicación rode mas de una vez? Este codigo abajo, yo puzo en el .DPR.

Cita:

Var HprevHist : HWND;

begin
Application.Initialize;

HprevHist := FindWindow(Nil, PChar('DM_Principal'));
if HprevHist = 0 then
begin
Application.CreateForm(TDM_Principal, DM_Principal);
Application.CreateForm(TDM_PDV, DM_PDV);
Application.CreateForm(TFRM_Menu, FRM_Menu);
Application.CreateForm(TFrmAvisoEcf, FrmAvisoEcf);
Application.Run;
end else
MessageDlg('Você não pode executar outra cópia do aplicativo', mtInformation, [mbOK], 0);

end.

dec 04-04-2008 17:49:51

Hola,

Echa un vistazo a la unidad UIApp.pas del compañero Román. ;)

Paulao 04-04-2008 18:36:17

Yo hizo un Download de unidad, pero no vino nada. La unidad estava dañada. Hizo 2 vezes, y fue la misma cosa, entoces deje de intertarlo.

dec 04-04-2008 18:38:28

Hola,

Pues lo lamento mucho. En mi caso puedo acceder perfectamente a la unidad, por otro lado, tan estupenda, que no me importa copiar aquí su código fuente:

Código Delphi [-]
unit UIApp;

interface

implementation

uses
  Windows, SysUtils, Forms;

const
  { Cadenas para registrar el mutex y el mensaje }
  sMutex   = '10D73234-C9F7-4C2D-BC7E-39B5820AF456';
  sActivar = '3F154732-CCDE-4BC7-9439-AFCD3BCFA84D';

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.

Basta con añadirla al proyecto, directamente, en el archivo "DPR", por ejemplo, para que la aplicación en cuestión no se ejecute dos veces. Para más información, véase la página de Román enlazada arriba.

Garry 09-04-2008 22:11:37

¡Hola, compañeros!

No sé cuando intentaste la descarga, DEC, pero a mí también me falla :confused:. En seguida le mando un mensajillo...

Gracias por copiar el código... y a Román por compartirlo, claro: me resultará muy útil, seguro.

dec 09-04-2008 22:20:02

Hola,

Pues no sé Garry, a mí personalmente aún me va bien...

Garry 09-04-2008 22:25:15

Pos no sé
 
Pues no sé si será cosa del Vista (¡otro casque más, cagüentó :mad:!)

El caso es que tras pulsar en el icono de descarga, me baja un archivo correctamente nombrado (*.pas), pero el contenido es un binario indescifrable. Ya le he notificado a Román este hilo...

El caso es que con tu copia ya resuelvo, pero, si el resto también me resulta útil, no sabría cómo hacer...

Garry 10-04-2008 12:05:45

¡Vaites (=osti, tú)! :eek:

No sé si sería algún problema con la conexión :confused:, o si Román averiguó y solucionó el problema, pero hoy me descarga perfectamente :D:D:D

Ss.

Delfino 10-04-2008 12:15:30

Tambien existe el componente TjvAppInstances de la JVCL.. q permite tb activar o desactivar la caracteristica durante la ejecucion..


La franja horaria es GMT +2. Ahora son las 03:45:46.

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