Vaya mirar un cuadrado de 30x30 (900 pixelitos) me tarda en el XP 11.82 ms, en Vista cuesta 11082.08 ms, ¡¡11 segundos!!, ¡76 míseros píxeles por segundo en un ordenador que hace millones y millones de operaciones por segundo!
No encuentro solución para resolver esto. Gracias, lo de "quita el Vista" ya lo sé, pero no siempre es posible
Por el foro inglés encontré una idea aceptable, que es hacer una captura del trozo que se va a mirar y mirar ahí directamente los píxeles con ayuda de la API en gdi32.dll. Incluso hay un udf que explota esa idea:
http://www.autoitscript.com/forum/index ... opic=63318
Pero tengo dos problemas:
a) Estoy mirando una zona cambiante y hay que estar haciendo capturas continuamente...
b) Por ahora la más importante: ¡No funciona! Ni el udf ni una versión que he hecho yo con esa idea me devuelven el color de los píxeles. Puede que yo haya metido la pata pero la udf se supone que está probada.
Abajo del todo os pongo mi código por si veis algún fallo que se pueda arreglar, o a lo mejor resulta que a mí no me va por otra razón, mirad a ver si os funciona...
Entonces, ¿alguien conoce alguna manera alternativa de hacer esto? ¿alguien sabe por qué ocurre? ¡porque no puede ser tan lento!
También he leido por el foro que se puede hacer una Dll que haga el PixelGetColor y usar eso desde AutoIt con DllCall, quizás sea fácil si alguien tiene las herramientas y el conocimiento y quiere probar... ¡que nos lo pase!
Este es el programita que usa GDIPlus, no me funciona, ni usando la idea de la udf que os he puesto arriba:
Código: Seleccionar todo
#Include <GDIPlus.au3>
#Include <WinAPI.au3>
#include <ScreenCapture.au3>
;El punto a mirar, para simplificar coger unas coordenadas entre 0 y $lado
;Naturalmente con GDI las coordenadas serían relativas al bitmap capturado, para
;PixelGetColor serían globales, pero coloco el cuadrado de captura en 0,0 para
;que coincidan y simplificar el ejemplo
Local $x = 5, $y = 5
$lado = 10 ;Por coger un cuadrito alrededor del pixel, se puede hacer más peque, claro
_GDIPlus_Startup()
$Contexto = _WinAPI_GetDC(0) ;DC del escritorio
; La UDF en vez de GetDC usa CreateCompatibleDC, tampoco funciona:
;$Contexto = _WinAPI_CreateCompatibleDC(0)
$HBITMAP = _ScreenCapture_Capture("", 0, 0, $lado, $lado, false)
_WinAPI_SelectObject($Contexto, $HBITMAP) ;Hay que seleccionar el bitmap para que GetPixel en GDI funcione
$col1 = PixelGetColor($x, $y)
$col2 = DLLCall("gdi32.dll", "int","GetPixel", "int",$Contexto, "int",$x, "int",$y)
MsgBox(0, "Coloritos", "PixelGetColor: <" & $col1 & ">" & @LF & "GetPixel: <" & $col2 & ">" & @LF )
_WinAPI_DeleteObject($HBITMAP)
_WinAPI_ReleaseDC(0, $Contexto)
;En la UDF como crean uno nuevo en vez de liberar, lo borran:
;_WinAPI_DeleteDC($Contexto)
_GDIPlus_ShutDown ()