Tema destacado: ¡Aprende hacking con práctica! - arZone, el wargame de elhacker.net
Autor
|
Tema: Píxeles y Bucle For (Leído 1,172 veces)
|
calk9
Desconectado
Mensajes: 55
|
Buenas a todos, estoy realizando una aplicacion la cual en un bucle for recorre, moviende el mouse, una determinada área y al encontrar un píxel con determinado color, se frene. EL PROBLEMA es que, al recorrer el área moviendo el cursor con el bucle previamente mencionado anda todo perfecto, con una rapidez considerable, en cambio cuando "coloco" el código para verificar si encuentra el píxel lo hace un 90% más lento. Este es mi código: Dim iX As Integer Dim iY As Integer Dim hdc As Long, pxColor As Double Call GetCursorPos(Mouse) For iX = Mouse.x To Mouse.x + 100 For iY = Mouse.y To Mouse.y + 75 Call SetCursorPos(iX, iY) 'Hasta acá todo bien, lo que viene ahora es lo que lenta muchísimo mi aplicación... hdc = GetDC(0) pxColor = GetPixel(hdc, Mouse.x, Mouse.y) ReleaseDC 0, hdc Me.Caption = Hex(pxColor) If Me.Caption = "AA431B" Then Exit For End If '// Next iY Next iX No se cual es el problema, por qué lo hace muchísimo mas lento. Ya que sin verificar el color lo hace en unas milésimas de segundo, y luego con el código para verificar tarda unos 20 o 30 en recorrer el mouse todo el área. Pues ni me imagino cuando haga áreas mas grandes. Saludos.
|
|
|
|
« Última modificación: 18 Septiembre 2011, 20:53 por raul338 »
|
En línea
|
|
|
|
Tenient101
Desconectado
Mensajes: 127
|
Te recomendaria que averigues sobre el formato Bitmap ... es mucho mas rapido, salu2 !
|
|
|
|
|
En línea
|
|
|
|
|
raul338
|
Exacto, toma un screenshot de la pantalla y de ahi analizalo 
|
|
|
|
|
En línea
|
|
|
|
calk9
Desconectado
Mensajes: 55
|
Pues es en tiempo real... como podría hacer?
|
|
|
|
|
En línea
|
|
|
|
ignorantev1.1
Desconectado
Mensajes: 424
/\ Así acabo cuando quiero programar...
|
Perdon que me meta pero:
Llevo tiempo buscando y no encuentro nada al respecto ¿Hay alguna forma de volcar el contenido de un bitmap(de un contenedor) a un array?
Esa (creo) sería la forma mas rápida de encontrar determinado pixel...
Saludos!
|
|
|
|
|
En línea
|
|
|
|
|
raul338
|
Llevo tiempo buscando y no encuentro nada al respecto ¿Hay alguna forma de volcar el contenido de un bitmap(de un contenedor) a un array?
Esa (creo) sería la forma mas rápida de encontrar determinado pixel...
un BMP es un array de por si con un par de bytes mas  Aca en un tuto de DirectX para C# explican mas o menos como leer un bmp desde archivo  : http://www.riemers.net/eng/Tutorials/DirectX/Csharp/Series1/tut10.phpNo hace falta saber mucho C# para entenderlo, tiene una buena introduccion 
|
|
|
|
|
En línea
|
|
|
|
calk9
Desconectado
Mensajes: 55
|
Aver si me pueden ayudar con mi planteo...
|
|
|
|
|
En línea
|
|
|
|
|
|
ignorantev1.1
Desconectado
Mensajes: 424
/\ Así acabo cuando quiero programar...
|
@calk9¡Tu no te metas!... Hahaha es broma  Esto te consumirá tiempo valioso siempre: Call SetCursorPos(iX, iY) No entiendo el porqué lo ideal sería colocar el cursor luego de encontrar el pixel que se busca, pero pues sabes lo que haces. Y todo esto: hdc = GetDC(0) pxColor = GetPixel(hdc, Mouse.x, Mouse.y) ReleaseDC 0, hdc Me.Caption = Hex(pxColor) If Me.Caption = "AA431B" Then Exit For End If yo lo reduciría a esto: Me.Caption = Hex$(point(ix,iy) If Me.Caption = "AA431B" Then Exit For End If @Raul338, @Tenient101Pues ambos son buenos tutoriales, pero no me referia a eso precisamente:  Más bien a cuando la imagen se almacena en un contenedor, por ejemplo hacer unos trazados en un picturebox(lineas, círculos y pintados), todo esto queda almacenado en el campo "image" del contenedor(picturebox o form), ahora volvar el contenido de "image" a un array, creo que la clave está en localizar el punto en memoria donde se almacena "image"... Saludos!
|
|
|
|
|
En línea
|
|
|
|
calk9
Desconectado
Mensajes: 55
|
Pues sigo teniendo el mismo problema. El API SetCursorPos no es el problema, ese bucle lo hace en unas milesimas de segundo. El problema es el ver el color del pixel. Gracias igual!  Sigo esperando respuestas... P.D: Te importaría darme tu msn?
|
|
|
|
|
En línea
|
|
|
|
|
raul338
|
No entiendo el porqué lo ideal sería colocar el cursor luego de encontrar el pixel que se busca, pero pues sabes lo que haces.
Eso, importa el puntero del mouse? GetDC y ReleaseDC consumen IO 
|
|
|
|
|
En línea
|
|
|
|
ignorantev1.1
Desconectado
Mensajes: 424
/\ Así acabo cuando quiero programar...
|
P.D: Te importaría darme tu msn? Si es para mí, mandame tu msn por PM, si no lo es... emmm... el caballo corre por el campo... Eso, importa el puntero del mouse? GetDC y ReleaseDC consumen IO  Exacto, ¿por qué no colocarlos fuera del bucle? ¿Y de mi plantiamiento ni hablamos verdad?  Saludos!
|
|
|
|
|
En línea
|
|
|
|
|
raul338
|
¿Y de mi plantiamiento ni hablamos verdad?  Para eso es la misma tecnica, no podemos usar el DC como un mapa de bits  asi que hay que convertirlo a BMP de ahi trabajar libremente 
|
|
|
|
|
En línea
|
|
|
|
calk9
Desconectado
Mensajes: 55
|
Jaj no me había fijado en eso, ya lo saqué del bucle pero el problema no era eso sino la sentencia if y el ver el color del pixel actual en donde se encuentra el mouse. Yo pense en ponerlo en un timer el código para verificar el color del pixel pero el bucle for es mucho más rapido que 1 milisegundo (que es el menor intervalo de un timer). Pues entonces digo, hago un hook y que al detectar WM_MOUSEMOVE verifique el color del pixel así estaría a la misma velocidad que el bulce... supongo jej. Pero necesito hacer un hook al mouse, no a mi aplicación y de otra ni hablar ya que tendría que inyectar una DLL... y no en basic  . Alguna idea?  Saludos.
|
|
|
|
« Última modificación: 19 Septiembre 2011, 00:48 por calk9 »
|
En línea
|
|
|
|
|
raul338
|
Para hacer un hook al mouse no tienes que inyectar una DLL, solo necesitas una funcion en un modulo 
|
|
|
|
|
En línea
|
|
|
|
|
|