Activar otra aplicación

11/03/2005 - 12:19 por Francisco Gomez | Informe spam
Estoy haciendo que solo pueda estar abierta una instancia de mi aplicación.
He visto soluciones usando Process, pero he encontrado una bastante más
cortita y elegante, usando Mutex:

private static Mutex s_Mutex;
...

[STAThread]
static void Main()
{
s_Mutex = new Mutex(true, "MiMutex");
if (s_Mutex.WaitOne(0,false))
{
Application.Run(mainForm);
}
else
{
//Aqui tengo que poner el código que me active la instancia de mi
aplicación que ya esta ejecutandose, al tiempo que esta se cerrará
}


Pues eso, lo que me falta es: ¿Como activo (maximizarla si está minnimizada,
ponerla en primer plano y darle el foco) la instancia de mi aplicación que ya
se está ejecutando?


Gracias!
 

Leer las respuestas

#1 Braulio Diez
11/03/2005 - 23:05 | Informe spam
Hola !

Te planteo tres posibles soluciones:

1. La de un programador veterano de windows y c++: ...Me temo que vas a
tener que usar llamadas a la API de Win 32, por lo que he encontrado,
basicamente lo que tienes que hacer es:

1. Puedes conseguir por el nombre del proceso, o el nombre del ventana, el
handle a la ventana de tu aplicación.
2. Conseguir el handle de la ventana
3. Llamar a la función de la API de Win32 "ShowWindow" or "SwitchToThisWindow"

2. Aprovechando tus Mutex... y objetos de sincronización de procesos, ¿ Por
que no te creas una hebra en tu proceso que se quede bloqueada por un Mutex y
que al arrancarse el otro proceso desbloquee ese Mutex (que estaría bloqueado
en la única aplicación tuya que esta corriendo) y hiciera un activate de la
ventana principal ? Esta solución es un poco rebuscada :-)

3. Otra solución para esto pasaría por usar remoting, pero igual sería como
matar una mosca a cañonazos...

Buena suerte
Braulio

"Francisco Gomez" wrote:

Estoy haciendo que solo pueda estar abierta una instancia de mi aplicación.
He visto soluciones usando Process, pero he encontrado una bastante más
cortita y elegante, usando Mutex:

private static Mutex s_Mutex;
...

[STAThread]
static void Main()
{
s_Mutex = new Mutex(true, "MiMutex");
if (s_Mutex.WaitOne(0,false))
{
Application.Run(mainForm);
}
else
{
//Aqui tengo que poner el código que me active la instancia de mi
aplicación que ya esta ejecutandose, al tiempo que esta se cerrará
}


Pues eso, lo que me falta es: ¿Como activo (maximizarla si está minnimizada,
ponerla en primer plano y darle el foco) la instancia de mi aplicación que ya
se está ejecutando?


Gracias!

Preguntas similares