Página 1 de 1
Problema ControlClick
Publicado: 04 Oct 2009, 08:00
por avechuche
Bueno resulta que tengo un problema que creo que puedo solucionarlo con ControlClick. Tengo que configurar El Ultraiso (de aragan :D). Lo hice con el MouseClick, hasta ahi todo perfecto, pero lo hice con una resolucion de 1024*768 y resulta que si cambio la resolucion a 800*600, el MouseClick ya no me hace clic en donde quiero. Seria si tomo toda la resolucion (1024*768) el clic lo hace en las Coord que estan en "Mouse" (416, 138), hasta ahi anda perfecto, pero si yo quiero que me haga Clic en determinada parte de la pantalla, mas alla de cual sea la resolucion, tendria que hacerme clic en las coord que estan en "Control - ControlClick" (264, 11), pero el problema es q no se como puedo hacer para que haga clic ahi. Alguna solucion? Les paso la parte importante del resumen del autoit. Gracias!
Código: Seleccionar todo
>>>> Window <<<<
Title: Configuración
Class: TfrmConfig
Position: 145, 94
Size: 433, 349
Style: 0x96C80000
ExStyle: 0x00000101
Handle: 0x00190468
>>>> Control <<<<
Class: TPageControl
Instance: 1
ClassnameNN: TPageControl1
Advanced (Class): [CLASS:TPageControl; INSTANCE:1]
ID: 1180778
Text:
Position: 4, 8
Size: 421, 273
ControlClick Coords: 264, 11
Style: 0x56010040
ExStyle: 0x00000000
Handle: 0x0012046A
>>>> Mouse <<<<
Position: 416, 138
Cursor ID: 0
Color: 0xDFDFDF
Re: Problema ControlClick
Publicado: 05 Oct 2009, 08:22
por Ximorro
Muy sencillo
, con ControlClick le indicas en qué control de qué ventana quieres pinchar, en principio pincha en el centro del control aunque puedes pasarle coordenadas.
En tu caso sería
ControlClick("Configuración", "", "TPageControl1")
Como "Configuración" es un nombre un poco genérico, yo usaría la clase:
ControlClick("[CLASS:TfrmConfig]", "", "TPageControl1")
En realidad "TPageControl1" es equivalente a "[CLASS:TPageControl; INSTANCE:1]", esos datos los saco de lo que nos has puesto.
La forma de usarlos está en la ayuda en "Using AutoIt" -> "Window Titles and Text (Advanced)" y "Controls", que está a continuación.
Re: Problema ControlClick
Publicado: 05 Oct 2009, 09:39
por avechuche
Hasta ahi va perfecto. Eso lo hice, pero quiero agregarle que haga un clic con el boton izq. en las coordenadas x,y. Como se lo agrego???
Re: Problema ControlClick
Publicado: 05 Oct 2009, 09:49
por Ximorro
Pues usando los demás parámetros puedes dar las coordenadas concretas:
ControlClick("[CLASS:TfrmConfig]", "", "TPageControl1", "main", 1, X, Y)
"main" es para asegurarse de que es el botón principal, aunque el ratón esté configurado para zurdos.
El 1 es el número de clicks (un 2 haría doble-click)
En X,Y pones las coordenadas, si no las pones pulsa en el centro del control, ¿eso no te sirve?
Pero pinchar en el control te pincha ¿no? he leído que a veces es necesario activar la ventana, si no no funciona ControlClick.
Si las coordenadas exactas donde quieres pinchar cambian con la resolución tendrás que poner una condición que lo mire y cambiarlas en consecuencia. O si se trata de pinchar sobre cierto texto igual se puede buscar.
Re: Problema ControlClick
Publicado: 05 Oct 2009, 17:41
por avechuche
Bueno nada me anda cuando cambio de resolucion ... lo que hice fue agregar la "Opt("MouseCoordMode",0)" y todo perfecto :) anda en cualquier resolucion! :)
Re: Problema ControlClick
Publicado: 06 Oct 2009, 09:59
por Ximorro
¡Me alegro de que lo hayas solucionado!
Pues creía que ControlClick ya usaba coordenadas relativas, qué raro. ¿O es que estás usando MouseClick?
Re: Problema ControlClick
Publicado: 06 Oct 2009, 21:13
por avechuche
Ximorro escribió:¡Me alegro de que lo hayas solucionado!
Pues creía que ControlClick ya usaba coordenadas relativas, qué raro. ¿O es que estás usando MouseClick?
Este es mi código. lo hice un poco con el AU3Recorder y despues lo modifique segun las necesidades.
Código: Seleccionar todo
Opt("WinWaitDelay",100)
Opt("WinTitleMatchMode",4)
Opt("WinDetectHiddenText",1)
Opt("MouseCoordMode",0)
#NoTrayIcon
;~ Run("setup.exe /verysilent")
;~ ProcessWaitClose("setup.exe")
Sleep(250)
;~ Run("REGEDT32.EXE /S reg.reg")
Sleep(250)
Run(@ProgramFilesDir&"\UltraISO\UltraISO.exe")
$tiempo = TimerInit()
Do
Sleep(2000)
If WinActive("Alcohol Command Launcher") Then
;~ If not WinActive("Alcohol Command Launcher") then WinActivate("Alcohol Command Launcher")
;~ WinWaitActive("Alcohol Command Launcher", "", 2)
ControlClick("Alcohol Command Launcher", "", "Button1")
WinWaitActive("UltraISO")
MouseMove(287,31)
MouseDown("left")
MouseUp("left")
Sleep(250)
MouseMove(304,58)
MouseDown("left")
MouseUp("left")
;~ WinWait("Configuración")
;~ If Not WinActive("Configuración") Then WinActivate("Configuración")
WinWaitActive("[CLASS:TfrmConfig]")
Sleep(250)
MouseMove(268,47)
MouseDown("left")
MouseUp("left")
Sleep(250)
MouseMove(265,146)
MouseDown("left")
MouseUp("left")
Sleep(250)
MouseMove(144,328)
MouseDown("left")
MouseUp("left")
ProcessClose("UltraISO.exe")
Exit
Else
If WinActive("[CLASS:TfrmMain]") Then ;TfrmMain = UltraISO (Title del programa)
Sleep(250)
MouseMove(287,31)
MouseDown("left")
MouseUp("left")
Sleep(250)
MouseMove(304,58)
MouseDown("left")
MouseUp("left")
;~ WinWait("Configuración")
;~ If Not WinActive("Configuración") Then WinActivate("Configuración")
;~ Sleep(2000)
WinWaitActive("[CLASS:TfrmConfig]")
Sleep(250)
MouseMove(268,47)
MouseDown("left")
MouseUp("left")
Sleep(250)
MouseMove(265,146)
MouseDown("left")
MouseUp("left")
Sleep(250)
MouseMove(144,328)
MouseDown("left")
MouseUp("left")
ProcessClose("UltraISO.exe")
Exit
EndIf
EndIf
Until TimerDiff($tiempo)>=5000
MsgBox(4096,"Error","Ha habido algún tipo de error en la aplicación al no encontrarse la ventana", 1)
ProcessClose("UltraISO.exe")
Exit
Pero ahora tengo un nuevo problema, resulta que si pongo WinWaitActive("xxxxxx") y nunca aparece esa ventana (activa) el script se queda tildado. Bueno hasta ahi estaria bien, pasaria eso, pero si yo le agrego la siguiente secuencia:
Código: Seleccionar todo
Do
WinWaitActive ("xxxxxx")
....
....
....
Until TimerDiff($tiempo)>=5000
ProcessClose("yyyyyyyyy")
Si en 5 segundos no aparece ninguna de las ventanas, no tendria que cerrar el programa????? se me queda tildado en la parte de WinWaitActive ya que la ventana "xxxxxx" nunca aparece ...
Re: Problema ControlClick
Publicado: 07 Oct 2009, 09:35
por Ximorro
Aaaaaah, efectivamente es con MouseMove, entonces sí hay que cambiar el coormode si quieres relativas.
Respecto a lo de WinWaitActive tienes suerte, resulta que la misma función ya lleva un parámetro opcional con un timeout, así que si quieres esperar como mucho 5 segundos una ventana haces:
WinWaitActive("Titulo", "", 5)
El segundo parámetro es "Texto", típico para buscar ventanas, si te basta con el título se deja como cadena vacía.
El tercer parámetro es el tiempo que quieres esperar por si no sale, ¡ojo que está en segundos, no milisegundos!
Para saber si ha saltado el tiempo sin que aparezca la ventana se sabe con el valor devuelto, si es 0 (cero) es que ha saltado el timeout, por ejemplo con esto esperaríamos 5 segundos a que se abra la calculadora:
Código: Seleccionar todo
If Not WinWait("Calculadora", "", 5) Then
MsgBox(16, "Ventana no encontrada", "Error conectando con Calculadora, ventana no encontrada.")
Else
;Aquí la ventana ya está abierta
EndIf
Bueno, ahí uso que a efectos prácticos 1=true y 0=false, también se puede hacer
If WinWait("Calculadora", "", 5)=0 Then ;esto sería cierto si salta el timeout
Re: Problema ControlClick
Publicado: 08 Oct 2009, 00:11
por avechuche
Gracias por tu tiempo :), ya sabia lo del tiempo en el WinWaitActive, pero yo tengo otro dilema. Supongamos lo siguiente...
tengo el siguiente código
Código: Seleccionar todo
WinWaitActive("Titulo", "", 5) =====> espera 5 segundos hasta que la ventana se active, si esta no aparece, sigue
ControlClick("Titulo", "", "button1")
WinWaitActive("Titulo2","", 5) =====> espera 5 segundos hasta que la ventana se active, si esta no aparece, sigue
ControlClick("Titulo2", "", "button1")
WinWaitActive("Titulo3","", 5) =====> espera 5 segundos hasta que la ventana se active, si esta no aparece, sigue
ControlClick("Titulo3", "", "button1")
WinWaitActive("Titulo4","", 5) =====> espera 5 segundos hasta que la ventana se active, si esta no aparece, sigue
ControlClick("Titulo4", "", "button1")
WinWaitActive("Titulo5","", 5) =====> espera 5 segundos hasta que la ventana se active, si esta no aparece, sigue
ControlClick("Titulo5", "", "button1")
Bueno hasta ahi han pasado 25 seg, no es nada, solo 25 seg, pero creo que se puede mejorar. Por eso agrege el siguiente comando. Chefito me lo habia propuesto antes para controlar en otro script que hice.
Bueno eso lo uso junto a "TimerInit()" y "TimerDiff" de la siguiente manera.
Código: Seleccionar todo
$tiempo = TimerInit()
Do
...
(todo el código anterior, el de las WinWaitActive)
...
Until TimerDiff($tiempo)>=5000
ProcessClose("xxxxxx.exe")
....
Que pasaria ahi, Si en 5 segundos no aparece ninguna de las ventanas antes mencionadas o cualquier otra con otro titulo saltaria a la siguiente linea del "Until", en este caso ProcessClose. Bueno el dilema es el siguiente. Si yo le pongo tiempo a las WinWaitActive, el Do no funciona, tengo que esperar los 25 segundos de las WinWaitActive. No se como arreglarlo. Si le saco el tiempo a los WinWaitActive, no me sirve, porque se va a quedar esperando que aparezca activa una ventana con ese titulo. gracias!
Re: Problema ControlClick
Publicado: 08 Oct 2009, 09:44
por Ximorro
Vamos a ver, el primer código no se espera 25segs, eso es el máximo, esperará eso si no salen las ventanas.
WinWait deja de esperar en cuanto aparece la ventana, si cada ventana aparece en un segundo, pues esperará 5 segundos en total, si aparecen cada décima de segundo, tardará sólo medio segundo en total.
El while no funciona como quieres porque no se llega al until hasta que ha ejecutado todo un ciclo, y para eso debe pasar por todos los WinWait.
El problema es que como estás encadenadas si una no sale no hace falta esperar a las demás porque tampoco van a salir.
Lo que tienes que hacer es que si una ventana no sale en 5 segundos, parar el proceso, no seguir esperando las demás, pues de todas maneras no van a salir.
Empezaría algo así como:
Código: Seleccionar todo
If Not WinWaitActive("Titulo", "", 5) Then
ProcessClose("xxxxxx.exe")
return 0; ver notas abajo sobre la manera de salir
EndIf
ControlClick("Titulo", "", "button1")
Y lo mismo en todas las demás.
Bueno, porque entiendo que ese ProcessClose no es de tu programa AutoiT, sino de ese del que estás mirando las ventanas ¿no?
El return tiene sentido si estás dentro de una función (lo normal también sería poner algo en @error) luego es cosa del que llama mirar si hay error y dar un mensaje o lo que sea. Si simplemente vas a salir puedes poner un EXIT y ya está, aunque deberías dar un mensaje antes al usuario para que sepa que el programa ha parado porque la ventana no ha salido en 5segs...
Por supuesto todo esto es sin el while.