FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
Ejecutar aplicacion externa y que este en primer plano
Hola, necesito ejecutar una aplicacion externa (lo estoy haciendo con WinExec('C:\winnt\notepad.exe',1) ) y que este siempre en primer plano sin importar las aplicaciones que se abran despues. Quiero hacer un timer que cada x segundos muestre la aplicacion pero no se como hacerlo.
Muchas gracias |
#2
|
||||
|
||||
Puedes intentar encontrar el identificador de la ventana de la aplicación externa usando FindWindow. Una vez que lo obtengas usas la función SetWindowPos para colocarla siempre visible:
// Saludos |
#3
|
||||
|
||||
Hola, estuve revisando este tema. El problema con el método anterior es que el usuario podría tener abiertas otras instancias de la aplicación externa y no hay garantía de que FindWindow te regrese la ventana que tú abriste en lugar de otra.
Un método un poco más complicado consiste en abrir la aplicación directamente con CreateProcess para obtener el identificador del hilo de la aplicación:
Ahora la cuestión es obtener el identificador de la ventana principal asociada al hilo. El problema es que el concepto de ventana principal en realidad es poco claro. Hay aplicaciones, como Word, donde todas las ventanas abiertas son principales y simplemente la última en cerrarse es la que manda cerrar la aplicación. De cualquier manera la siguiente función GetMainWindow que sigue te devolverá el identificador de la primera ventana que encuentre y que tenga "aspecto" de ser la principal:
Cuando quieras poner la aplicación como siempre visible usarías algo como
pasándole el ThreadId obtenido con ExecuteProcess. La llamada a BringWindowToTop no parece ser necesaria para aplicaciones sencillas como el block de notas pero sí para aplicaciones como Word. Posteriormente puedes usar el ThreadId obtenido para cerrar la aplicación externa:
Nota que tanto MakeAppTopMost como CloseApp vuelven a calcular el identificador de ventana a partir del identificador de hilo. Esto es así porque el identificador de ventana puede cambiar a lo largo de la vida de la aplicación. Por ejemplo, en una aplicación hecha en Delphi, si durante la ejecución cambias el estilo del borde de la ventana, ésta se crea nuevamente dando un nuevo identificador. En cambio, el identificador de hilo permanece inmutable durante toda la ejecución de una aplicación. // Saludos Última edición por roman fecha: 06-07-2004 a las 16:51:38. Razón: Un identificador en código mal nombrado |
#4
|
||||
|
||||
Cita:
Un detalle, en mi código cuando busco la ventana perteneciente al hilo de ejecución, manejo un timeout interno porque sucede que si el equipo no es muy veloz, es posible que el proceso esté creado pero no la ventana. Saludos!
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. |
#5
|
||||
|
||||
Cita:
Intente modificar GetMainWindow así
pero no resulta. Aun cuando se obtiene el identificador de la ventana principal si la llamada a MakeAppTopMost es inmediata no siempre funciona. Finalmente cambié ExecuteProcess:
Así, por defecto esperará 2 segundos antes de proseguir pero se le puede cambiar el valor en la llamada. // Saludos |
#6
|
||||
|
||||
Yo había creado unas funciones mas genéricas, tu "GetMainWindow" es algo así:
Me parece que es un poco mas real el concepto de TimeOut, en tu código es un tiempo de espera. (Solo una cuestión semántica ) Vale aclarar que usar GetTickCount no es del todo seguro para estos casos, ya que si el equipo estuvo encendido durante 49.7 días, este vuelve a cero. Un poco extraño, pero en uno de los proyectos en que estoy trabajando ha sucedido .
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. |
|
|
|