Página 1 de 1

Trae la ventana al frente (focus)

Publicado: 12 Feb 2011, 15:43
por josh
Buenas;

He intentado hacer un script con autoit para instalar IE7.
En principio todo me funciona bien, pero si en mitad de la instalacion de IE7 abro una carpeta o cualquier otra aplicacion, la ventana de instalacion de IE pasa a segundo plano y se estanca. Cuando con el raton, traigo al frente la ventana de instalacion, el script se lleva a cabo con normalidad.

Como se puede traer al frente en cualquier momento la ventana de instalacion que tengo indicada en el script?

He probado con winActivate pero no funciona

Este es el codigo que tengo con el que funciona en el caso que no se traiga al frente ninguna otra ventana/aplicacion.

Código: Seleccionar todo

WinWaitActive("Instalar Windows Internet Explorer", "&Siguiente >")
Send("{ENTER}")
WinWaitActive("Instalar Windows Internet Explorer", "&Acepto")
Send("{A}")
WinWaitActive("Instalar Windows Internet Explorer", "&Siguiente >")
Send("{ENTER}")
WinWaitActive("Instalar Windows Internet Explorer", "Reiniciar a&hora (recomendado)")
Send("!h")

Publicado: 12 Feb 2011, 16:26
por BasicOs
Puede ser que no identifique la ventana. Prueba a acortar el nombre de la ventana o usar otra de la opciones de uso q trabaja directamente con el identificador interno. Con opt.
TAMBIEN puede usar au3info para ver el titulo exacto y/o el texto dentro d la ventana.
Saludos

Re: Trae la ventana al frente (focus)

Publicado: 14 Feb 2011, 10:26
por Ximorro
Casiiiiiiiiiiiiii ;-)

Es que WinWaitActive NO activa la ventana, sino que se espera a que la actives tú.

Sí que hay que hacerlo con WinActivate, que es lo que la activa, el problema es que no existe un WinWAITActivate, que se espere hasta que esté activa, pero podemos crearla nosotros juntando las otras dos.

Puedes usar por ejemplo esto:

Código: Seleccionar todo

Func _WinWaitActivate($titulo, $texto="", $timeout=0)
	WinActivate($titulo, $texto)
	WinWaitActive($titulo, $texto, $timeout)
EndFunc
Le he puesto un tercer parámetro opcional como time-out, igual que tiene WinWaitActive. Le he puesto como valor por defecto un cero, que es lo que hace que espere indefinidamente, eso no está documentado pero por las pruebas que he hecho me ha funcionado.

Re: Trae la ventana al frente (focus)

Publicado: 14 Feb 2011, 10:42
por Ximorro
Estoy pensando que igual este no es tu problema. Esto de antes es para que se espere a que la ventana está activa, pero a lo mejor tu problema es que aún ¡no existe!

Otra opción es esperar a que la ventana exista, y que cuando eso ocurra la active. En este caso sería así:
(Le pongo WaitExistActiva, esperar-existir-activar, para distinguirlo de la anterior, pero el nombre anterior también le va bien, mientras no uses las dos a la vez en el mismo programa no hay problema en usar el mismo nombre)

Código: Seleccionar todo

Func _WinWaitExistActivate($titulo, $texto="", $t=0)
	WinWait($titulo, $texto, $t)
	WinActivate($titulo, $texto)
EndFunc
Me parece que en tu caso este modelo de WinWaitActivate te irá mejor, porque sospecho que lo que pasa es que al darle por ejemplo al botón "siguiente", la nueva ventana no aparece instantáneamente con lo que hacer enseguida un WinActivate no funciona, pues no hay nada que activar. Es decir, el problema no sería que hubiera perdido el foco (que es para lo que serviría la función anterior) sino que aún no existe, así que en este segundo método primero esperamos a que aparezca y entonces la activamos antes de hacer el Send.

OTRO MÉTODO:
Por cierto, que hay otra manera de trabajar con las ventanas que NO requiere que estén activas. Se hace mandando comandos directamente a los controles, mírate las funciones Controlxxx, por ejemplo ControlClick para pulsar botones o ControlSend para mandar texto a una caja de texto.