Post by A_AhkUser » 19 Nov 2017, 10:32
Puedes facilmente anadir la funcionalidad de tu script en la funcion si quieres.
Primero, modificando los parametros
p_PosX y
p_PosY de
WaitPixelColor de tal manera que tengan
una valor por defecto - lo que permite no especificarles a la llamada de la funcion - y por ejemplo aqui una "cadena de caracteres vacia":
Code: Select all
WaitPixelColor(p_DesiredColor,p_PosX="",p_PosY="",p_TimeOut=0,p_GetMode="",p_ReturnColor=0) { ; definicion de la funcion
; ...
}
WaitPixelColor(colorQueBuscar,,, tiempoQueEsperarEnSegundos*1000, modo) ; llamada de la funcion que no especifica 'x' y 'y'
Asi, solo necessita despues comprobar en el cuerpo de la definicion de la funcion
WaitPixelColor si
x y
y han sido especificados al la llamada de la funcion:
Code: Select all
usarPuntero := ((p_PosX = "") and (p_PosY = "")) ; usarPuntero vale true si p_PosX y p_PosY no ha sido especificados
Y si
usarPuntero vale
true, llamamos
MouseGetPos y utilizamos sus valores en el loop para compensar la falta de los dos parametros:
Code: Select all
if (usarPuntero) ; si usarPuntero vale true...
MouseGetPos, p_PosX, p_PosY ; ...la funcion utiliza en lugar los 'x' y 'y' de la posicion del puntero al la llamada de PixelGetColor abajo
PixelGetColor, l_OutputColor, %p_PosX%, %p_PosY%, %p_GetMode%
Finalmente, una otra cosita a pesar de todo importante es de modificar el
CoordMode del raton para que concuerda que lo del Pixel - para ese propósito podemos utilzar
A_CoordModePixel:
Code: Select all
CoordMode, Mouse, %A_CoordModePixel% ; A_CoordModePixel es una variable interna de AutoHotkey que continene el valor actual de la coordmode pixel: de modo que PixelGetColor y MouseGetPos busca segun los mismos parametros
Lo mismo script con esta foncionalidad; tirara un
MsgBox tan pronto como encontre el color si el raton lo esta sobrevolando (y antes de que se haya agotado el tiempo):
Code: Select all
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn ; Enable warnings to assist with detecting common errors.
#SingleInstance, force
CoordMode, Pixel, Screen
; ---------------------- variables: modificales a tu eleccion ----------------------
colorQueBuscar := "0xFF0000" ; rojo en R(ed)G(reen)B(blue) prueba con este color picker por ejemplo: https://duckduckgo.com/?q=color+picker+%23ff0000&ia=answer
modo := "RGB"
; x := 467
; y := 256
tiempoQueEsperarEnSegundos := 4
; ----------------------------------------------------------
return
!z:: ; ALT+Z
valor := WaitPixelColor(colorQueBuscar,,, tiempoQueEsperarEnSegundos*1000, modo) ; probamos sin especificar 'x' y 'y' para utilzar los del puntero...
; valor := WaitPixelColor(colorQueBuscar, x, y, tiempoQueEsperarEnSegundos*1000, modo)
if (valor = 0) ; si el color ha sido encontrado antes de que se agote el tiempo la funcion devuelve 0
MsgBox, color encontrada
else if (valor = 1) ; si surgió un problema
MsgBox, surgió un problema
else if (valor = 2) ; si se ha agotado el tiempo la funcionn devuelve dos
MsgBox, el color no ha sido encontrado - especialmente: se ha agotado el tiempo
return
WaitPixelColor(p_DesiredColor,p_PosX="",p_PosY="",p_TimeOut=0,p_GetMode="",p_ReturnColor=0) {
CoordMode, Mouse, %A_CoordModePixel% ; A_CoordModePixel es una variable interna de AutoHotkey que continene el valor actual de la coordmode pixel: de modo que PixelGetColor y MouseGetPos busca segun los mismos parametros
l_Start := A_TickCount
usarPuntero := ((p_PosX = "") and (p_PosY = "")) ; if x and y no ha sido recibidos, usarPuntero vale true
Loop {
if (usarPuntero) ; si usarPuntero vale true...
MouseGetPos, p_PosX, p_PosY ; ...la funcion utiliza en lugar los 'x' y 'y' de la posicion del puntero
PixelGetColor, l_OutputColor, %p_PosX%, %p_PosY%, %p_GetMode%
If ( ErrorLevel )
Return ( p_ReturnColor ? l_OutputColor : 1 ) ; si p_ReturnColor no ha sido especificado, devuelve 1
If ( l_OutputColor = p_DesiredColor )
Return ( p_ReturnColor ? l_OutputColor : 0 ) ; ...si p_ReturnColor no ha sido especificado, devuelve 0
If ( p_TimeOut ) && ( A_TickCount - l_Start >= p_TimeOut ) ; si p_TimeOut ha sido especificado y si ha transcurrido p_TimeOut milisegundos...
Return ( p_ReturnColor ? l_OutputColor : 2 ) ; ...si p_ReturnColor no ha sido especificado, devuelve 2
}
}
; https://github.com/MasterFocus/AutoHotkey/blob/master/Functions/WaitPixelColor/WaitPixelColor.ahk
Puedes facilmente anadir la funcionalidad de tu script en la funcion si quieres.
Primero, modificando los parametros [c]p_PosX[/c] y [c]p_PosY[/c] de [c]WaitPixelColor[/c] de tal manera que tengan [url=https://www.autohotkey.com/docs/Functions.htm#optional]una valor por defecto[/url] - lo que permite no especificarles a la llamada de la funcion - y por ejemplo aqui una "cadena de caracteres vacia":
[code]WaitPixelColor(p_DesiredColor,p_PosX="",p_PosY="",p_TimeOut=0,p_GetMode="",p_ReturnColor=0) { ; definicion de la funcion
; ...
}
WaitPixelColor(colorQueBuscar,,, tiempoQueEsperarEnSegundos*1000, modo) ; llamada de la funcion que no especifica 'x' y 'y'[/code]
Asi, solo necessita despues comprobar en el cuerpo de la definicion de la funcion [c]WaitPixelColor[/c] si [c]x[/c] y [c]y[/c] han sido especificados al la llamada de la funcion:
[code]usarPuntero := ((p_PosX = "") and (p_PosY = "")) ; usarPuntero vale true si p_PosX y p_PosY no ha sido especificados[/code]
Y si [c]usarPuntero[/c] vale [c]true[/c], llamamos [c]MouseGetPos[/c] y utilizamos sus valores en el loop para compensar la falta de los dos parametros:
[code]
if (usarPuntero) ; si usarPuntero vale true...
MouseGetPos, p_PosX, p_PosY ; ...la funcion utiliza en lugar los 'x' y 'y' de la posicion del puntero al la llamada de PixelGetColor abajo
PixelGetColor, l_OutputColor, %p_PosX%, %p_PosY%, %p_GetMode%[/code]
Finalmente, una otra cosita a pesar de todo importante es de modificar el [c]CoordMode[/c] del raton para que concuerda que lo del Pixel - para ese propósito podemos utilzar [url=https://www.autohotkey.com/docs/Variables.htm#CoordMode]A_CoordModePixel[/url]:
[code]CoordMode, Mouse, %A_CoordModePixel% ; A_CoordModePixel es una variable interna de AutoHotkey que continene el valor actual de la coordmode pixel: de modo que PixelGetColor y MouseGetPos busca segun los mismos parametros[/code]
[hr][/hr]
Lo mismo script con esta foncionalidad; tirara un [c]MsgBox[/c] tan pronto como encontre el color si el raton lo esta sobrevolando (y antes de que se haya agotado el tiempo):
[code]
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn ; Enable warnings to assist with detecting common errors.
#SingleInstance, force
CoordMode, Pixel, Screen
; ---------------------- variables: modificales a tu eleccion ----------------------
colorQueBuscar := "0xFF0000" ; rojo en R(ed)G(reen)B(blue) prueba con este color picker por ejemplo: https://duckduckgo.com/?q=color+picker+%23ff0000&ia=answer
modo := "RGB"
; x := 467
; y := 256
tiempoQueEsperarEnSegundos := 4
; ----------------------------------------------------------
return
!z:: ; ALT+Z
valor := WaitPixelColor(colorQueBuscar,,, tiempoQueEsperarEnSegundos*1000, modo) ; probamos sin especificar 'x' y 'y' para utilzar los del puntero...
; valor := WaitPixelColor(colorQueBuscar, x, y, tiempoQueEsperarEnSegundos*1000, modo)
if (valor = 0) ; si el color ha sido encontrado antes de que se agote el tiempo la funcion devuelve 0
MsgBox, color encontrada
else if (valor = 1) ; si surgió un problema
MsgBox, surgió un problema
else if (valor = 2) ; si se ha agotado el tiempo la funcionn devuelve dos
MsgBox, el color no ha sido encontrado - especialmente: se ha agotado el tiempo
return
WaitPixelColor(p_DesiredColor,p_PosX="",p_PosY="",p_TimeOut=0,p_GetMode="",p_ReturnColor=0) {
CoordMode, Mouse, %A_CoordModePixel% ; A_CoordModePixel es una variable interna de AutoHotkey que continene el valor actual de la coordmode pixel: de modo que PixelGetColor y MouseGetPos busca segun los mismos parametros
l_Start := A_TickCount
usarPuntero := ((p_PosX = "") and (p_PosY = "")) ; if x and y no ha sido recibidos, usarPuntero vale true
Loop {
if (usarPuntero) ; si usarPuntero vale true...
MouseGetPos, p_PosX, p_PosY ; ...la funcion utiliza en lugar los 'x' y 'y' de la posicion del puntero
PixelGetColor, l_OutputColor, %p_PosX%, %p_PosY%, %p_GetMode%
If ( ErrorLevel )
Return ( p_ReturnColor ? l_OutputColor : 1 ) ; si p_ReturnColor no ha sido especificado, devuelve 1
If ( l_OutputColor = p_DesiredColor )
Return ( p_ReturnColor ? l_OutputColor : 0 ) ; ...si p_ReturnColor no ha sido especificado, devuelve 0
If ( p_TimeOut ) && ( A_TickCount - l_Start >= p_TimeOut ) ; si p_TimeOut ha sido especificado y si ha transcurrido p_TimeOut milisegundos...
Return ( p_ReturnColor ? l_OutputColor : 2 ) ; ...si p_ReturnColor no ha sido especificado, devuelve 2
}
}
; https://github.com/MasterFocus/AutoHotkey/blob/master/Functions/WaitPixelColor/WaitPixelColor.ahk[/code]