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 17: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. |
#7
|
||||
|
||||
Bueno, pero, básicamente es mi while Result = 0 do (creo ). El caso es que probé esto y aún habiendo "encontrado" la ventana, la llamada a MakeAppTopMost no tenía efecto. Yo supongo que, como es normal en las aplicaciones Windows, luego de creada la ventana viene una llamada a SetWindowPos y si no ha pasado suficiente tiempo puede ser que ésta se haga después de la que nosotros hacemos.
// Saludos |
#8
|
||||
|
||||
Cita:
Por cierto Federico, ¿podrías editar tu mensaje? Ya no cabe en el ancho de mi pantalla. // Saludos |
#9
|
||||
|
||||
Cita:
Para comparar, yo subí el ejemplo que tenía armado a mi página, no recuerdo para quien lo había hecho, me llama la atención que no lo haya puesto en el foro anteriormente. El ejemplo hace otra cosa, pero creo que es muy aplicable a este caso. Saludos!
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. |
#10
|
||||
|
||||
Cita:
De cualquier forma, mi apunte del while Result = 0 do no iba encaminado a decir que estábamos haciendo lo mismo, sino, esencialmente lo mismo y que hasta donde veo persiste el problema de que las llamadas a otras funciones como MakeAppTopMost no sutan efecto. ¡Todo esto por el block de notas! |
#11
|
||||
|
||||
Cita:
¡¡Es para molestar un poco!!
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. |
#12
|
||||
|
||||
Bueno, pero con tal paranoia mejor no enciendo mi PC.
Además estarás de acuerdo que podemos crear una aplicación que no sólo se llame notepad.exe sino que además la clase de su ventana principal se llame NOTEPAD. Por otra parte, casi cualquier cosa que sustituya al note pad será mejor que tan infame aplicación // Saludos |
|
|
|