Test Foro de elhacker.net SMF 2.1

Programación => Scripting => Mensaje iniciado por: MeCraniDOS en 20 Agosto 2013, 21:12 PM

Título: [AutoIt] Solución a un bucle?
Publicado por: MeCraniDOS en 20 Agosto 2013, 21:12 PM
Hola, bueno pues tengo un problema, tengo este código:

Código (vbnet) [Seleccionar]

Func MoverIcono()

   While $VarBucle = True

$X_Escritorio = 0
$Y_Escritorio = 0


       $Area_Escr = _ImageSearch('Area.bmp', 0, $X_Escritorio, $Y_Escritorio, 0)

       if $Area_Escr = 1 Then
MouseMove($X_Escritorio, $Y_Escritorio, 5)
MouseClick("left")

       if $BuscarIcono1 = True or $BuscarIcono2 = True
         
            Do

$X = 0
$Y = 0
               
               if $BuscarIcono1 = True Then

            $Icono1 = _ImageSearch('img/Icono1.bmp', 0, $X, $Y, 0)

            While $Icono1 = 1
      MouseMove($X, $Y, 5)
      MouseClick("left")
      Sleep(2000)
            WEnd
      EndIf

               if $BuscarIcono2 = True Then

            $Icono2 = _ImageSearch('img/Icono2.bmp', 0, $X, $Y, 0)

            While $Icono2 = 1
      MouseMove($X, $Y, 5)
      MouseClick("left")
      Sleep(2000)
            WEnd
      EndIf

             Until $Icono1 = 0 or $Icono2 = 0

       Else

Sleep(10000)

       Endif

       Else

       ; (Comentario) "Error": No se ha encontrado el area del mapa  

       Endif

   WEnd

EndFunc



El código en si funciona bien, el error que da para mi es que no hace exactamente lo que yo quiero, y no se como arreglarlo...

La función lo que hace es buscar el área que yo le indico, (las coordenadas del área del escritorio están cambiadas), y va clickando en esa zona cada 10 segundos, y justo cuando da el click busca los iconos, pero en esos 10 segundos del Sleep(10000) no hace nada :-\

Lo que quiero es que haga click en el área que le indico, y en esos 10 segundos, antes del siguiente click este buscando los iconos, es decir, que si activo la opción del icono1, este indefinidamente buscando ese icono y moviendo y clickando, y a los 10 segundos, haga click en otras coordenadas del escritorio y siga buscando hasta pasados los próximos 10 segundos, etc

Espero que puedan ayudarme, creo que no hace falta saber de este lenguaje para contestar, cualquier bucle es igual sea en el lenguaje que sea  :¬¬

Saludos
Título: Re: [AutoIt] Solución a un bucle?
Publicado por: Stakewinner00 en 20 Agosto 2013, 23:25 PM
Si lo que quieres es que haga una cosa al mismo tiempo que espera los 10s me temo que necesitaras un multithread, en C++ no es especialmente complicado pero claro tiene que ser de scripting, no?
Título: Re: [AutoIt] Solución a un bucle?
Publicado por: MeCraniDOS en 20 Agosto 2013, 23:32 PM
Cita de: Stakewinner00 en 20 Agosto 2013, 23:25 PM
multithread

Mirare a ver como funciona e intentare investigar  ;-)
Título: Re: [AutoIt] Solución a un bucle?
Publicado por: #!drvy en 20 Agosto 2013, 23:35 PM
Y porque simplemente no creas una funcion que se encargue del click y que vaya midiendo el tiempo.

Osease, sustituyes MouseClick (y MouseMove si hace falta) por una función que por muchas veces que la llamen, solo haga 1 click cada 10 segundos.

Saludos
Título: Re: [AutoIt] Solución a un bucle?
Publicado por: MeCraniDOS en 21 Agosto 2013, 00:27 AM
Cita de: drvy en 20 Agosto 2013, 23:35 PM
Y porque simplemente no creas una funcion que se encargue del click y que vaya midiendo el tiempo.

Osease, sustituyes MouseClick (y MouseMove si hace falta) por una función que por muchas veces que la llamen, solo haga 1 click cada 10 segundos.

Saludos

Porque esa función ya esta, si pones:

Código (vbnet) [Seleccionar]
MouseClick("left", $X_Escritorio, $Y_Escritorio, 1, 10000)

Clicka cada 10 segundos, pero estamos en las mismas, no hace lo que esta a continuación, espera 10 segundos, clicka y pasa a la siguiente función  :-\
Título: Re: [AutoIt] Solución a un bucle?
Publicado por: #!drvy en 21 Agosto 2013, 02:40 AM
1. No hagas sleep. No es lo mismo comprobar si la ultima llamada que se hizo fue hace 10 segudos que esperar 10 segundos para recibir la proxima llamada.

2. La función invocala desde el while y pasale los parametros (cursor x,y)

Edit: Obviamente lo que te recomienda stake es mucho mejor y mas optimizado pero si lo quieres hacer sin mas a lo burro... es lo que haria xD

Saludos
Título: Re: [AutoIt] Solución a un bucle?
Publicado por: Danyfirex en 21 Agosto 2013, 04:18 AM
hola
usa

DllCallbackRegister

saludos.


si explicas mejor lo que quieres hacer te doy una mano porque la verdad no entendí nada :S

Título: Re: [AutoIt] Solución a un bucle?
Publicado por: MeCraniDOS en 21 Agosto 2013, 12:10 PM
Cita de: drvy en 21 Agosto 2013, 02:40 AM
1. No hagas sleep. No es lo mismo comprobar si la ultima llamada que se hizo fue hace 10 segudos que esperar 10 segundos para recibir la proxima llamada.

He descartado usar el Sleep  :silbar:

Cita de: Stakewinner00 en 20 Agosto 2013, 23:25 PM
me temo que necesitaras un multithread

He estado mirando y AutoIt no permite multithread  :-(

Cita de: Danyfirex en 21 Agosto 2013, 04:18 AM
si explicas mejor lo que quieres hacer te doy una mano porque la verdad no entendí nada :S

La función lo que hace es buscar las coordenadas en el escritorio, si no selecciono ninguna opción, mueve el ratón cada 10 segundos, (le paso un valor random, pero quité eso porque no hacia falta aquí)

Código (vbnet) [Seleccionar]
$X_Escritorio = 0
$Y_Escritorio = 0


En el caso de que $BuscarIcono1 o $BuscarIcono2 estén activadas, lo que quiero es que haga click en la pantalla, y mientras espera 10 segundos hasta volver a dar el click, escanee la pantalla buscando los iconos, así sucesivamente hasta que finalice la función.

Ahora lo que hace es, dar click, escanear la pantalla y esperar 10 segundos sin hacer nada :-\
Título: Re: [AutoIt] Solución a un bucle?
Publicado por: Danyfirex en 21 Agosto 2013, 14:43 PM
Podrías hacer algo así para saber cuando pasaron los 10 segundo y dar click. de lo contrario sigo buscando.

Código (php) [Seleccionar]
Local $begin = TimerInit()

Local $dif=0
while 1

$dif=TimerDiff($begin)
if $dif >=10000 then
msgbox(0,"","Hago clik")
$begin = TimerInit()
endif
wend


saludos
Título: Re: [AutoIt] Solución a un bucle?
Publicado por: MeCraniDOS en 21 Agosto 2013, 15:09 PM
Cita de: Danyfirex en 21 Agosto 2013, 14:43 PM
Podrías hacer algo así para saber cuando pasaron los 10 segundo y dar click. de lo contrario sigo buscando.

Código (php) [Seleccionar]
Local $begin = TimerInit()

Local $dif=0
while 1

$dif=TimerDiff($begin)
if $dif >=10000 then
msgbox(0,"","Hago clik")
$begin = TimerInit()
endif
wend


saludos


Y de que me sirve eso?

http://www.autoitscript.com/autoit3/docs/functions/TimerInit.htm (http://www.autoitscript.com/autoit3/docs/functions/TimerInit.htm)

http://www.autoitscript.com/autoit3/docs/functions/TimerDiff.htm (http://www.autoitscript.com/autoit3/docs/functions/TimerDiff.htm)

Lo que quiero es estar escaneando la pantalla buscando los iconos mientras pasan los 10 segundos  :-\ :-\
Título: Re: [AutoIt] Solución a un bucle?
Publicado por: Danyfirex en 21 Agosto 2013, 15:15 PM
Sera que no la capto.  :rolleyes:


quieres buscar en la pantalla y ir clickeando cada 10 segundo?
Título: Re: [AutoIt] Solución a un bucle?
Publicado por: MeCraniDOS en 21 Agosto 2013, 16:45 PM
Cita de: Danyfirex en 21 Agosto 2013, 15:15 PM
quieres buscar en la pantalla y ir clickeando cada 10 segundo?

si, el click cada 10 segundos, y en esos 10 segundos estar escaneando la pantalla
Título: Re: [AutoIt] Solución a un bucle?
Publicado por: Danyfirex en 22 Agosto 2013, 13:46 PM
usa AdlibRegister.



Código (php) [Seleccionar]



AdlibRegister("Tufuncion",10*1000)


;aquí tu código para Buscar



Func Tufuncion()
;aqui el codigo para clikear.
EndFunc





saludos
Título: Re: [AutoIt] Solución a un bucle?
Publicado por: MeCraniDOS en 23 Agosto 2013, 13:19 PM
Cita de: Danyfirex en 22 Agosto 2013, 13:46 PM
usa AdlibRegister.

Gracias, voy a probar :silbar:
Título: Re: [AutoIt] Solución a un bucle?
Publicado por: 79137913 en 23 Agosto 2013, 13:46 PM
HOLA!!!

Código (vb) [Seleccionar]
Func MoverIcono()

While VarBucle = True

    X_Escritorio = 0
    Y_Escritorio = 0
   
   
    Area_Escr = ImageSearch("Area.bmp", 0, X_Escritorio, Y_Escritorio, 0)
   
    If Area_Escr = 1 Then
    Call MouseMove(X_Escritorio, Y_Escritorio, 5)
    Call MouseClick("left")
   
    If BuscarIcono1 = True Or BuscarIcono2 = True Then
   
        Do
            X = 0
            Y = 0
            Z = 0
            A = 0
                Icono1 = 0
                If BuscarIcono1 = True Then
                    Icono1 = ImageSearch("img/Icono1.bmp", 0, X, Y, 0)
                End If
                If Icono1 = 1 Then
                    Call MouseMove(X, Y, 5)
                    Call MouseClick("left")
                End If
                icono2 = 0
                If BuscarIcono2 = True Then
                    icono2 = ImageSearch("img/Icono2.bmp", 0, Z, A, 0)
                End If
                If icono2 = 1 Then
                    Call MouseMove(X, Y, 5)
                    Call MouseClick("left")
                End If
                Call Sleep(2000)
        Loop Until Icono1 = 0 And icono2 = 0
       
        Else
       
        Sleep (10000)
       
        End If
       
        Else
       
        ' (Comentario) "Error": No se ha encontrado el area del mapa
   
    End If

Wend

EndFunc


GRACIAS POR LEER!!!