Pixel Color + Función de ampliación
Publicado: 02 Feb 2009, 01:29
Aquí les dejo una aplicación que permite obtener los códigos decimal y hexagesimal de cualquier color en la pantalla. Posee una lupa que facilita la tarea y permite mover el cursor con el teclado. Está en inglés:
Descargar EXE
Código:
Bueno, la función de la lupa la creó Larry (uno de los grandes colaboradores de AutoIt). Yo me tomé el trabajo de estudiarla y hacerla lo más general posible, usando las funciones de _WinApi y _GDIplus para que se puede embeber dentro de cualquier ventana o usar como uno quiera!
Aquí la función:
Perdón que esté en inglés, acá explico los parámetros:
Eso creará un recuadro en la coordenada (0,0) (izquierda, arriba) de 150x150 que maximizará el área que se encuentra en la coordenada (@DesktopWidth-100,0) (derecha, arriba). El área a maximizar es de 100x100. Noten que si el área a maximizar es de las mismas dimensiones que la ventana de muestra, no se maximizará nada. Si la ventana es más grande que el área, se maximiza. Si es más pequeña, se minimizará.
Acá otro ejemplo usando una GUI. Es mucho más efectivo, como verán y muestra todo lo que se puede hacer con ésto.
Aquí el resultado:
Descargar EXE
Código:
Código: Seleccionar todo
#include <GUIconstants.au3>
#include <Staticconstants.au3>
#include <Windowsconstants.au3>
#include <Editconstants.au3>
#include<Misc.au3>
#NoTrayIcon
Opt("WinTitleMatchMode", 4)
Opt("WinWaitDelay", 0)
Opt("GUIonEventMode",1)
;~ Global $SRCCOPY = 0x00CC0020
Global $leave = 0
Global $Paused=0
$MouseModifier = 1
$PressedTime = 1
HotKeySet("{PAUSE}", "TogglePause")
HotKeySet("{INS}", "_copyHEX")
Tooltip("AU3MAG", 0, 0,"","",4)
$MyhWnd = WinGetHandle("classname=tooltips_class32")
GUICreate("Pixel Color", 180, 410,0, 0, -1, $WS_EX_TOPMOST)
GUISetOnEvent($GUI_EVENT_CLOSE,"_exit")
GUICtrlCreateGroup(" Mouse coords ", 10, 10, 160, 50)
GUICtrlCreateLabel("X:", 25, 33, 15, 15)
$MousePosX=GUICtrlCreateInput("", 40, 30, 40, 20, $ES_READONLY)
GUICtrlCreateLabel("Y:", 90, 33, 15, 15)
$MousePosY=GUICtrlCreateInput("", 105, 30, 40, 20, $ES_READONLY)
GUICtrlCreateGroup(" Color codes ", 10, 70, 160, 110)
GUICtrlCreateLabel("Decimal:", 25, 93, 50, 15)
$PixelColor=GUICtrlCreateInput("", 80, 90, 70, 20, $ES_READONLY)
GUICtrlCreateLabel("Hex:", 25, 123, 50, 15)
$hexColor=GUICtrlCreateInput("", 80, 120, 70, 20,$ES_READONLY)
GUICtrlCreateLabel("Color:", 25, 153, 50, 15)
$MostrarColor=GUICtrlCreateLabel("", 80, 150, 70, 20,$ES_READONLY)
GUICtrlCreateGroup(" Special options ", 10, 190, 160, 145)
$RB_Full = GUICtrlCreateRadio("Full Screen", 25, 210, 100, 20)
GUICtrlSetState(-1, $GUI_CHECKED)
$RB_Window = GUICtrlCreateRadio("Active Window", 25, 230, 100, 20)
$Mag= GUICtrlCreateCheckbox("Magnify", 25, 250, 100, 20)
$Solid= GUICtrlCreateRadio("Solid crosshair", 35, 270, 100, 20)
$Inver= GUICtrlCreateRadio("Inverted crosshair", 35, 290, 120, 20)
$KeyBMouse= GUICtrlCreateCheckbox("Move cursor with keyb.", 25, 310, 140, 20)
$Ayuda=GUICtrlCreateButton("Help",10,345,77)
GUICtrlSetOnEvent(-1,"Ayuda")
$Saltar=GUICtrlCreateButton("Jump to",92,345,77)
GUICtrlSetOnEvent(-1,"Saltar")
GUICtrlCreateLabel("PAUSE: Freeze/Unfreeze", 0, 380 ,180,15,$SS_CENTER)
GUICtrlSetColor(-1,0x00808080)
GUICtrlCreateLabel("INS: Copy hex code to clipboard", 0, 395 ,180,15,$SS_CENTER)
GUICtrlSetColor(-1,0x00808080)
GUISetState()
data()
Func data()
While 1
Sleep(50)
Opt("WinTitleMatchMode",4)
If (_IsPressed(25) + _IsPressed(26) + _IsPressed(27) + _IsPressed(28)) = 0 Then
_ResetSpeed()
EndIf
$msg=GUIGetMsg()
Select
Case $msg=$GUI_EVENT_CLOSE
Exit
EndSelect
If GUICtrlRead($KeyBMouse)=$GUI_CHECKED Then
MouseKeyb()
Else
MouseKeybNO()
EndIf
If GUICtrlRead($Mag)=$GUI_CHECKED Then
GUICtrlSetState($RB_Window,$GUI_DISABLE)
GUICtrlSetState($Solid,$GUI_ENABLE)
GUICtrlSetState($Inver,$GUI_ENABLE)
GUICtrlSetState($RB_Full,$GUI_CHECKED)
WinSetState($MyhWnd,"",@SW_SHOW)
MAG()
Else
GUICtrlSetState($Solid,$GUI_DISABLE+$GUI_UNCHECKED)
GUICtrlSetState($Inver,$GUI_DISABLE+$GUI_UNCHECKED)
GUICtrlSetState($RB_Window,$GUI_ENABLE)
WinSetState($MyhWnd,"",@SW_HIDE)
EndIf
If GUICtrlRead($RB_Full) = $GUI_CHECKED Then
Opt("MouseCoordMode", 1)
Opt("PixelCoordMode", 1)
$pos=MouseGetPos()
$color=PixelGetColor($pos[0],$pos[1])
GUICtrlSetData($MousePosX, $pos[0])
GUICtrlSetData($MousePosY, $pos[1])
GUICtrlSetData($PixelColor,$color)
$HEX6=StringRight(Hex($color),6)
GUICtrlSetData($hexColor,"0x"&$HEX6)
GUICtrlSetBkColor($MostrarColor,"0x"&Hex($color))
Else
Opt("MouseCoordMode", 0)
Opt("PixelCoordMode", 0)
Opt("WinTitleMatchMode",1)
$win = WinGetPos("")
$pos=MouseGetPos()
If $pos[0] >= 0 And $pos[0] <= $win[2] and $pos[1] >= 0 And $pos[1] <= $win[3] Then
$color=PixelGetColor($pos[0],$pos[1])
GUICtrlSetData($MousePosX, $pos[0])
GUICtrlSetData($MousePosY, $pos[1])
GUICtrlSetData($PixelColor,$color)
$HEX6=StringRight(Hex($color),6)
GUICtrlSetData($hexColor,"0x"&$HEX6)
GUICtrlSetBkColor($MostrarColor,"0x"&Hex($color))
Else
GUICtrlSetData($MousePosX, "----")
GUICtrlSetData($MousePosY, "----")
GUICtrlSetData($PixelColor,"")
GUICtrlSetData($hexColor,"")
EndIf
EndIf
WEnd
EndFunc
Func TogglePause()
$Paused = NOT $Paused
While $Paused
sleep(10)
$msg=GUIGetMsg()
Select
Case $msg=$GUI_EVENT_CLOSE
Exit
EndSelect
WEnd
EndFunc
Func MAG()
;Author: Larrydalooza
WinSetOnTop($MyhWnd,"",1)
$MyHDC = DLLCall("user32.dll","int","GetDC","hwnd",$MyhWnd)
If @error Then Return
$DeskHDC = DLLCall("user32.dll","int","GetDC","hwnd",0)
If Not @error Then
$xy = MouseGetPos()
If Not @error Then
$l = $xy[0]-10
$t = $xy[1]-10
DLLCall("gdi32.dll","int","StretchBlt","int",$MyHDC[0],"int",0,"int",0,"int",100,"int",100,"int",$DeskHDC[0],"int",$l,"int",$t,"int",20,"int",20,"long",$SRCCOPY)
If $xy[0]<(@DesktopWidth-120) then
$XArea= $xy[0] + 20
Else
$XArea= $xy[0] - 120
EndIf
If $xy[1]<(@DesktopHeight-120) then
$YArea= $xy[1] + 20
Else
$YArea= $xy[1] - 120
EndIf
WinMove($myhwnd, "",$XArea,$YArea , 100, 100)
If GUICtrlRead($Solid)=$GUI_CHECKED Then
CrossHairsSOLID($MyHDC[0])
EndIf
If GUICtrlRead($Inver)=$GUI_CHECKED Then
CrossHairsINV($MyHDC[0])
EndIf
EndIf
DLLCall("user32.dll","int","ReleaseDC","int",$DeskHDC[0],"hwnd",0)
EndIf
DLLCall("user32.dll","int","ReleaseDC","int",$MyHDC[0],"hwnd",$MyhWnd)
EndFunc
Func Ayuda()
MsgBox(0,"Help","*Use magnifier for more presicion." & @CRLF & "" & @CRLF & "*Use 'move cursor with keyboard' option for more presicion." & @CRLF & " -Keeping arrow key pressed increases speed." & @CRLF & " -Shift+'arrow' moves mouse cursor faster." & @CRLF & "" & @CRLF & "*Use 'Jump to' to move mouse cursor to a specified pixel" & @CRLF & @CR&"*Press PAUSE to freeze and unfreeze." & @CRLF & "" & @CRLF &"*Press INS to copy HEX code to clipboard.")
EndFunc
Func Saltar()
Do
$SaltarCord=InputBox("Jump to","Enter pixel coordinates you want to jump to."&@CRLF&"Example: 123,420",MouseGetPos(0)&","&MouseGetPos(1),"",150,150)
$CoordsM=StringSplit($SaltarCord,",")
Until @error OR ($CoordsM[1]<=@DesktopWidth AND $CoordsM[2]<=@DesktopHeight)
if not @error Then
BlockInput(1)
MouseMove($CoordsM[1],$CoordsM[2])
BlockInput(0)
EndIf
EndFunc
Func MouseKeyb()
HotKeySet("+{UP}", "_UpArrow")
HotKeySet("{UP}", "_UpArrow")
HotKeySet("+{DOWN}", "_DownArrow")
HotKeySet("{DOWN}", "_DownArrow")
HotKeySet("+{LEFT}", "_LeftArrow")
HotKeySet("{LEFT}", "_LeftArrow")
HotKeySet("+{RIGHT}", "_RightArrow")
HotKeySet("{RIGHT}", "_RightArrow")
EndFunc
Func MouseKeybNO()
HotKeySet("+{UP}")
HotKeySet("{UP}")
HotKeySet("+{DOWN}")
HotKeySet("{DOWN}")
HotKeySet("+{LEFT}")
HotKeySet("+{LEFT}")
HotKeySet("{LEFT}")
HotKeySet("+{RIGHT}")
HotKeySet("{RIGHT}")
EndFunc
Func nada()
EndFunc
Func _copyHEX()
ClipPut(Guictrlread($hexColor))
EndFunc ;==>_ShowInfo
Func _UpArrow()
Local $MousePos = MouseGetPos()
If _IsPressed(10) Then
$i = 10
Else
$i = 1
EndIf
If $MousePos[1] > 0 Then
_BoostMouseSpeed()
MouseMove($MousePos[0], $MousePos[1] - ($MouseModifier * $i), 1)
EndIf
EndFunc ;==>_UpArrow
Func _DownArrow()
If _IsPressed(10) Then
$i = 10
Else
$i = 1
EndIf
Local $MousePos = MouseGetPos()
If $MousePos[1] < @DesktopHeight Then
_BoostMouseSpeed()
MouseMove($MousePos[0], $MousePos[1] + ($MouseModifier * $i),1)
EndIf
EndFunc ;==>_DownArrow
Func _LeftArrow()
If _IsPressed(10) Then
$i = 10
Else
$i = 1
EndIf
Local $MousePos = MouseGetPos()
If $MousePos[0] > 0 Then
_BoostMouseSpeed()
MouseMove($MousePos[0] - ($MouseModifier * $i), $MousePos[1],1)
EndIf
EndFunc ;==>_LeftArrow
Func _RightArrow()
If _IsPressed(10) Then
$i = 10
Else
$i = 1
EndIf
Local $MousePos = MouseGetPos()
If $MousePos[0] < @DesktopWidth Then
_BoostMouseSpeed()
MouseMove($MousePos[0] + ($MouseModifier * $i), $MousePos[1],1)
EndIf
EndFunc ;==>_RightArrow
Func _BoostMouseSpeed()
If IsInt($PressedTime / 10) Then
$MouseModifier = $MouseModifier + 1
$PressedTime = $PressedTime + 1
Else
$PressedTime = $PressedTime + 1
EndIf
EndFunc
Func _ResetSpeed()
$MouseModifier = 1
$PressedTime = 1
EndFunc ;==>_ResetSpeed
Func CrossHairsSOLID(ByRef $hdc)
;Author: Larrydalooza
Local $hPen, $hPenOld
$hPen = DllCall("gdi32.dll","hwnd","CreatePen","int",0,"int",5,"int",0x555555)
$hPenOld = DllCall("gdi32.dll","hwnd","SelectObject","int",$hdc,"hwnd",$hPen[0])
DLLCall("gdi32.dll","int","MoveToEx","int",$hdc,"int",52,"int",0,"ptr",0)
DLLCall("gdi32.dll","int","LineTo","int",$hdc,"int",52,"int",46)
DLLCall("gdi32.dll","int","MoveToEx","int",$hdc,"int",52,"int",58,"ptr",0)
DLLCall("gdi32.dll","int","LineTo","int",$hdc,"int",52,"int",100)
DLLCall("gdi32.dll","int","MoveToEx","int",$hdc,"int",0,"int",52,"ptr",0)
DLLCall("gdi32.dll","int","LineTo","int",$hdc,"int",46,"int",52)
DLLCall("gdi32.dll","int","MoveToEx","int",$hdc,"int",58,"int",52,"ptr",0)
DLLCall("gdi32.dll","int","LineTo","int",$hdc,"int",100,"int",52)
DllCall("gdi32.dll","hwnd","SelectObject","int",$hdc,"hwnd",$hPenOld[0])
DllCall("gdi32.dll","int","DeleteObject","hwnd",$hPen[0])
EndFunc
Func CrossHairsINV(ByRef $hdc)
;Author: Larrydalooza
Local CONST $NOTSRCCOPY = 0x330008
DLLCall("gdi32.dll","int","BitBlt","int",$hdc,"int",50,"int",0,"int",5,"int",49,"int",$hdc,"int",50,"int",0,"int",$NOTSRCCOPY)
DLLCall("gdi32.dll","int","BitBlt","int",$hdc,"int",50,"int",56,"int",5,"int",49,"int",$hdc,"int",50,"int",56,"int",$NOTSRCCOPY)
DLLCall("gdi32.dll","int","BitBlt","int",$hdc,"int",0,"int",50,"int",49,"int",5,"int",$hdc,"int",0,"int",50,"int",$NOTSRCCOPY)
DLLCall("gdi32.dll","int","BitBlt","int",$hdc,"int",56,"int",50,"int",44,"int",5,"int",$hdc,"int",56,"int",50,"int",$NOTSRCCOPY)
EndFunc
Func _exit()
Exit
EndFunc
Bueno, la función de la lupa la creó Larry (uno de los grandes colaboradores de AutoIt). Yo me tomé el trabajo de estudiarla y hacerla lo más general posible, usando las funciones de _WinApi y _GDIplus para que se puede embeber dentro de cualquier ventana o usar como uno quiera!
Aquí la función:
Código: Seleccionar todo
Func MAG($hWnd, $iLeft, $iTop, $win_width, $win_height, $x, $y, $width, $height, $GDIdll = "gdi32.dll")
;===============================
; Function Name: Mag()
; Parameter(s): $hWnd: handle to the GUI
; $iLeft: Left coordinate of the zoom window (relative to $hWnd window)
; $iTop: Top coordinate of the zoom window (relative to $hWnd window)
; $x: X coordinate of the upper left corner of the area to zoom
; $y: Y coordinate of the upper left corner of the area to zoom
; $witdh: width of the area to zoom
; $height: height of the area to zoom
; $win_width: width of the zoom window
; $win_height: height of the zoom window
; $GDIdll: [optional] handle to gdi32.dll. Pass this parameter when calling repeatedly.
;Requires: #include <WinApi.au3>
; Author(s): Larry, modified a bit by Nahuel
;===============================
$MyHDC = _WinAPI_GetDC($hWnd)
$DeskHDC = _WinAPI_GetDC(0)
DllCall($GDIdll, "int", "StretchBlt", "int", $MyHDC, "int", $iLeft, "int", $iTop, "int", $win_width, "int", $win_height, "int", $DeskHDC, "int", $x, "int", $y, "int", $width, "int", $height, "long", 0x00CC0020)
_WinAPI_ReleaseDC(0, $DeskHDC)
_WinAPI_ReleaseDC($hWnd, $MyHDC)
EndFunc ;==>MAG
Ejemplo:$hWnd: handle de la ventana a embeber
$iLeft: Coordenada izquierda de la ventana de zoom (relativo a la ventana $hWnd)
$iTop: Coordenada superior de la ventana de zoom (relativa a la ventana $hWnd)
$win_width: Ancho de la ventana de zoom.
$win_height: Alto de la ventana de zoom.
$x: Coordenada izquierda del área de la pantalla a maximizar.
$y: Coordenada superior del área de la pantalla a maximizar.
$witdh: Ancho del área a maximizar.
$height: Alto del área a maximizar.
$GDIdll: [optional] handle de gdi32.dll. Pasar este parámetro usando Dllopen si se llama a la función repetidamente.
Código: Seleccionar todo
MAG(0,0,0,150,150,@DesktopWidth-100,0,100,100)
Acá otro ejemplo usando una GUI. Es mucho más efectivo, como verán y muestra todo lo que se puede hacer con ésto.
Código: Seleccionar todo
#include <WinApi.au3>
$handle = GUICreate("Mag",200,200)
GUISetState()
MAG($handle,0,0,200,200,0,0,100,100)
Do
Until GUIGetMsg()=-3
Func MAG($hWnd, $iLeft, $iTop, $win_width, $win_height, $x, $y, $width, $height, $GDIdll = "gdi32.dll")
;===============================
; Function Name: Mag()
; Parameter(s): $hWnd: handle to the GUI
; $iLeft: Left coordinate of the zoom window (relative to $hWnd window)
; $iTop: Top coordinate of the zoom window (relative to $hWnd window)
; $x: X coordinate of the upper left corner of the area to zoom
; $y: Y coordinate of the upper left corner of the area to zoom
; $witdh: width of the area to zoom
; $height: height of the area to zoom
; $win_width: width of the zoom window
; $win_height: height of the zoom window
; $GDIdll: [optional] handle to gdi32.dll. Pass this parameter when calling repeatedly.
;Requires: #include <WinApi.au3>
; Author(s): Larry, modified a bit by Nahuel
;===============================
$MyHDC = _WinAPI_GetDC($hWnd)
$DeskHDC = _WinAPI_GetDC(0)
DllCall($GDIdll, "int", "StretchBlt", "int", $MyHDC, "int", $iLeft, "int", $iTop, "int", $win_width, "int", $win_height, "int", $DeskHDC, "int", $x, "int", $y, "int", $width, "int", $height, "long", 0x00CC0020)
_WinAPI_ReleaseDC(0, $DeskHDC)
_WinAPI_ReleaseDC($hWnd, $MyHDC)
EndFunc ;==>MAG