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 :smt002 , 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

:smt006

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.

Código: Seleccionar todo


Do

...

Until

 
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.