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!

Preguntas similare

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!
Respuesta Responder a este mensaje
#2 Francisco Gomez
14/03/2005 - 16:39 | Informe spam
A propósito, gracias a tu orientadión he encotrado un código GENIAL basado en
tu solucion nº1, la de utilizar el API

http://www.codeproject.com/csharp/c...rocess.asp

Usa mutex para comprobar si hay un proceso en ejecución y llamaa al api para
poner el primero en marcha

Sin embargo, me gusta la idea del mutex y los threads, pero...no veo como
hacerlo... (no tengo demasiada experiencia)

A ver si entiendo tu idea... Creo un nuevo thread que se queda a la espera
de recibir una señal para ejecutar su 'sección crítica'. Esta sección crítica
lo único que hace es activar (poner en primer plano) mi ventana, y luego
vuelve a quedarse a la espera. Para eso utilizo un Mutex. Bien.. pero...

¿Quien tiene el mutex bloqueado hasta que es liberado para que mi 'sección
crítica' se ejecute? ¿Como puede un proceso recien ejecutado (la instancia
duplicada de mi proceso ejecutable que ha detectado al proceso original en
marcha y, por tanto, se va a cerrar) señalizar (release)un Mutex que no posee
(el mutex que bloquea la sección crítica de mi roceso principal)?

Todo lo que he visto con respecto a threads, a excepción del mutex, se
refiere a sincronización enrte hilos lanzados por el mismo proceso. No he
visto mecanismos que permitan señalización entre procesos lanzados por
separado (a excepción del mutex, como te dije)

¿Me podrías orientar un poco?

Gracias
"Braulio Diez" wrote:

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!
Respuesta Responder a este mensaje
#3 Jose Luis Manners
12/04/2005 - 02:08 | Informe spam
Hace algún tiempo publiqué algo sobre esto en mi blog. Puedes encontrar el
"post" en este enlace:

http://blogs.geekdojo.net/jmanners/.../3352.aspx

Saludos,

Jose Luis Manners, MCP
English: http://blogs.geekdojo.net/jmanners
Español: http://weblogs.golemproject.com/jmanners/


"Encuentra felicidad en tu trabajo o nunca serás feliz."
Cristóbal Colón


"Francisco Gomez" wrote in
message news:
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!
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida