 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
R. Porcar Invitado
|
Publicado: Mie 15 Nov, 2000 2:55 pm Asunto: Hacer que una aplicación solo pueda ejecutarse una vez simul |
|
|
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 |
|
 |
rockfavc Cmdr


Registrado: 23 Ago 2002Mensajes: 138Ubicación: Colombia (Medellín)
|
Publicado: Lun 16 Dic, 2002 2:30 pm Asunto: |
|
|
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 |
|
 |
jhonalba Ens


Registrado: 24 Ago 2002Mensajes: 40Ubicación: Colombia
|
Publicado: Mie 01 Ene, 2003 2:07 am Asunto: Help |
|
|
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 |
|
 |
rockfavc Cmdr


Registrado: 23 Ago 2002Mensajes: 138Ubicación: Colombia (Medellín)
|
Publicado: Mar 21 Ene, 2003 4:16 pm Asunto: |
|
|
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 |
|
 |
jhonalba Ens


Registrado: 24 Ago 2002Mensajes: 40Ubicación: Colombia
|
Publicado: Mie 22 Ene, 2003 2:15 am Asunto: Hola... |
|
|
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 |
|
 |
rockfavc Cmdr


Registrado: 23 Ago 2002Mensajes: 138Ubicación: Colombia (Medellín)
|
Publicado: Jue 23 Ene, 2003 5:10 pm Asunto: |
|
|
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 |
|
 |
jhonalba Ens


Registrado: 24 Ago 2002Mensajes: 40Ubicación: Colombia
|
Publicado: Vie 24 Ene, 2003 4:23 am Asunto: Hola nuevamente... |
|
|
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 |
|
 |
gulfar Cdt

Registrado: 01 Feb 2003Mensajes: 7
|
Publicado: Sab 01 Feb, 2003 8:48 pm Asunto: |
|
|
| 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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|