Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Hacer que una aplicación solo pueda ejecutarse una vez simul

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Tips & Tricks
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Hacer que una aplicación solo pueda ejecutarse una vez simul Responder citando

code:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstopUSERES("Project1.res");
USEFORM("Unit1.cpp", Form1);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
::CreateMutex(NULL,NULL,"MUTEX");
if (GetLastError())
{
Application->Title = "Bill sucks";
HWND FirstWnd;
FirstWnd = :: FindWindow("TApplication", "miprograma");
if (::IsIconic(FirstWnd))
::ShowWindow(FirstWnd,SW_SHOWDEFAULT);
::SetForegroundWindow(FirstWnd);
}
else
{
Application->Initialize();
Application->Title = "miprograma";
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}
//---------------------------------------------------------------------------

Volver arriba
Mensaje    Asunto: Responder citando

Hola! R.Porcar, estuve probando la funcion y funciona de maravillak, solo que como puedo hacer para cuando trate de abrirla nuevamente esta se ponga al frente del usuario, algo asi como ocurre con el panel de control, que cuando lo tienes minimizado y lo tratas de abrir de nuevo este simplemente se maximiza.
En la Linea de codigo :
FirstWnd = :: FindWindow("TApplication", "Project1.exe");
en el parametro que pones como miprograma yo supongo que es el nombre del ejecutable, no se si sea correcto.

Muchas gracias por tus comentarios.

Andrés.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Help Responder citando

Hola,

Pruebate este codigo en el constructor de tu formulario y me cuentas:

Código:

__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
    keybd_event(VK_LWIN, 0, 0, 0);
    keybd_event('M', 0, 0, 0);
    keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0);
    HANDLE Video = ::FindWindow("TApplication","Video");
    if(::IsIconic(Video))
     {
        ShowWindow(Video,SW_SHOWDEFAULT);
        SetFocus();
     }
}


Nota que qui video es el nombre de tu aplicacion. Me funciona en BCB 5.0.

Saludos....


[/code]
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Hola! probé lo que me recomendaste y no obtuve el resultado deseado, simplemente abre otra instancia de la aplicacion. La aplicacion produce un ejecutable con el nombre LogAlarmEvent.exe, supongo que ese es el nombre que debe estar como nombre de la aplicacion.
Uso Builder 6, y Windows 2000 profesional.
En que sistema operativo lo has probado?

Lo implemente de la siguiente forma, creo que no hay errores:

__fastcall TFrmPrincipal::TFrmPrincipal(TComponent* Owner)
: TForm(Owner)
{
keybd_event(VK_LWIN, 0, 0, 0);
keybd_event('M', 0, 0, 0);
keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0);
HANDLE LogAlarmEvent = ::FindWindow("TApplication","LogAlarmEvent");
if(::IsIconic(LogAlarmEvent))
{
ShowWindow(LogAlarmEvent,SW_SHOWDEFAULT);
SetFocus();
}
}
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Hola... Responder citando

Hola,
Primero quiero decirte que el codigo:

Código:

    keybd_event(VK_LWIN, 0, 0, 0);
    keybd_event('M', 0, 0, 0);
    keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0);     


en el constructor de tu form principal hace que cuando corra tu aplicacion por primera vez se minimicen todas las ventanas que tienes abiertas (creo que esto no sirve para lo que necesitas).

Entonces para solucionar tu problema:

Código:

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
        try
        {
                ::CreateMutex(NULL,NULL,"MUTEX");
                if (GetLastError())
                 {
                     HWND FirstWnd;
                     FirstWnd = :: FindWindow("TApplication", "LogAlarmEvent");
                     if (::IsIconic(FirstWnd))
                         ::ShowWindow(FirstWnd,SW_SHOWDEFAULT);
                         ::SetForegroundWindow(FirstWnd);
                   }
                  else
                  {
                      Application->Initialize();
                      Application->Title = "LogAlarmEvent";
                      Application->CreateForm(__classid(TForm1), &Form1);
                      Application->Run();
                   }   
        }
        catch (Exception &exception)
        {
                 Application->ShowException(&exception);
        }
        return 0;
}



Hasta aqui ya lo sabias, pues lo habia dicho R. Porcar, ahora fijate que he quitado la linea de codigo:

Código:

  Application->Title = ".........";


Para que lo anterior funcione correctamente antes debes ir a la opcion Project/Options y en la pestaña Application debes poner el title de tu aplicacion es decir LogAlarmEvent y listo funciona.

Lo he probado con Win98 SE/WinME/Win2000 usando Bulder 5.0,

Espero haberte ayudado.

Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Hola Jhonalba y R.Porcar. Muchas gracias por sus aportes.
Aun no logro hacer que funcione la rutina.
Lo que quiero es algo como cuando tratas de abrir el Panel de control y ya se encoentraba abierto (pero minimizado, por ejemplo) e inmediatamente se viene al frente, creo que ustedes me entienden.
Las rutinas que Jhonalba funcionan bien hasta el punto de evitar abrir otra instancia de la aplicacion, pero no lo trae al frente.
Por si las moscas pongo la rutina que tengo:
PD: Lo pruebo con BCB6 y en WinXP, (será ese el detalle???)

//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE,
HINSTANCE,
LPSTR LineaComandos,
int)
{
try
{
::CreateMutex(NULL,NULL,"MUTEX");
if(GetLastError())
{
HWND FirstWnd;
FirstWnd = :: FindWindow("TApplication", "LogAlarmEvent");
if(::IsIconic(FirstWnd))
::ShowWindow(FirstWnd, SW_SHOWDEFAULT);
::SetForegroundWindow(FirstWnd);
}
else
{
Application->Initialize();
Application->Title = "LogAlarmEvent";
Application->CreateForm(__classid(TFrmPrincipal), &FrmPrincipal);
Application->CreateForm(__classid(TDM), &DM);
Application->CreateForm(__classid(TForm2), &Form2);
FrmPrincipal->sParametros = LineaComandos;
Application->Run();
}
}
catch(Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
//---------------------------------------------------------------------------

Muchas gracias
Felices dias
Andres
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Hola nuevamente... Responder citando

Hola rockfavc, cuentame si ya has probado:

Cita:

Para que lo anterior funcione correctamente antes de compilar debes ir a la opcion Project/Options y en la pestaña Application debes poner el title de tu aplicacion es decir LogAlarmEvent y listo funciona


Si la respuesta es si, me doy no entiendo porque a mi funciona y a ti no.

Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Hola jhonalba, he probado tu codigo y funciona a la perfección con el BCB 6 en XP, pero, como consiguo, que como dice rockfavc, traer al frente el programa, una vez ejecutado en el caso de que vuelvas a intentar ejecutarlo, y este minimizado?, Gracias!!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.