Os cuento
En un formulario de consulta del aplicativo que utilizamos se trata de introducir un numero en un campo indice, mandar un "TAB" en el mismo y esperar a que se ejecute un proceso automático que hace unas verificaciones, pasar al numero siguiente y así hasta miles de números mas adelante.
He conseguido hacer un bucle que haga la tarea:
Código: Seleccionar todo
$numeroinicial = InputBox("Seguridad", "Numero de entrada de comienzo verificacion.", "")
$numerofinal = InputBox("Seguridad", "numero final.", "")
If Not WinActive("Consulta de documento","") Then WinActivate("Consulta de documento","")
For $i = $numeroinicial To $numerofinal
Sleep(150)
Send($i)
Sleep(150)
Send("{tab}")
Sleep(150)
If Not WinActive("Consulta de documento","") Then WinActivate("Consulta de documento","")
WinWaitActive("Consulta de documento")
Sleep(150)
Send("{SHIFTDOWN}{TAB}")
Send("{SHIFTUP}")
Next
El caso es que como tarda unos 30 segundos la verificación de cada numero quiero "instanciar" el proceso abriendo 2 veces la aplicación en pantalla y hacer un proceso que recorra hacia delante y otro hacia atrás.
Os enseño el código:
Código: Seleccionar todo
$numeroinicial = InputBox("Seguridad", "Numero de entrada de comienzo de verificacion.", "")
$numerofinal = InputBox("Seguridad", "numero final.", "")
;Cambio el titulo de cada una de las ventanas para poder trabajar con ellas
If Not WinActive("Consulta de documento","") Then WinActivate("Consulta de documento","")
$tmpTitle = WinGetTitle("Consulta de documento")
WinSetTitle($tmpTitle,"","UNO")
If Not WinActive("Consulta de documento","") Then WinActivate("Consulta de documento","")
$tmpTitle = WinGetTitle("Consulta de documento")
WinSetTitle($tmpTitle,"","DOS")
$i2 = $numerofinal
For $i = $numeroinicial To $numerofinal
; Proceso creciente
If Not WinActive("UNO","") Then WinActivate("UNO","")
WinWaitActive("UNO")
Sleep(1000)
Send("{SHIFTDOWN}{TAB}")
Send("{SHIFTUP}")
Sleep(150)
Send($i)
Sleep(150)
Send("{tab}")
Sleep(150)
; Proceso numero 2 decreciente
If Not WinActive("DOS","") Then WinActivate("DOS","")
Sleep(500)
WinWaitActive("DOS")
Sleep(1000)
Send("{SHIFTDOWN}{TAB}")
Send("{SHIFTUP}")
Sleep(150)
; Iterador que decrece
$i2 = $i2-1
Send($i2)
Sleep(150)
Send("{tab}")
Sleep(150)
Next
¿Puedo preguntar con algún comando acerca del estado de la ventana ("UNO" o "DOS") o proceso y me responda si esta "busy" o si ya le puedo enchufar el siguiente número dado que en este caso winwaitactive no funciona?
¿Se os ocurre algo que pueda hacer?
Mil gracias
PD:No utilizo Controlsend porque la cabrona de mi aplicación cuando le da la gana cambia los números de instancia de los campos Edit (por ejemplo [CLASS:Edit; INSTANCE:60] y en un rato se redibuja el formulario y pasa al 61) no se porqué.
Saludos