Pixel Color + Función de ampliación

y programas personales para otros como tu, puede que te corrijan ;)
Responder
Avatar de Usuario
Nahuel
Hacker del Foro
Mensajes: 194
Registrado: 27 Jun 2007, 23:32
Ubicación: Argentina
Contactar:

Pixel Color + Función de ampliación

Mensaje por Nahuel »

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:

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
Perdón que esté en inglés, acá explico los parámetros:
$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.
Ejemplo:

Código: Seleccionar todo

MAG(0,0,0,150,150,@DesktopWidth-100,0,100,100)
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.

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
Aquí el resultado:
Imagen
Imagen
:smt001
No soy un hombre de plegarias, pero si estás en el cielo sálvame por favor Superman!
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Pixel Color + Función de ampliación

Mensaje por Chefito »

Como te dije en el otro post....muy buen programa y funciones, y muy interesante.

Gracias por compartir.

Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
Avatar de Usuario
XPyro
Profesional del Autoit
Mensajes: 542
Registrado: 04 Mar 2007, 10:12
Ubicación: México
Contactar:

Re: Pixel Color + Función de ampliación

Mensaje por XPyro »

Gracias por compartir Nahuel, interesante lupa :smt003
Imagen
Responder