Macro clicks sobre objeto de color

Pregunta Sin Miedo no te cortes cualquier cosa para empezar - Autoit se comienza facilmente.Para Ordenes o Comandos sueltos. Ver nota como preguntar.
Responder
Avatar de Usuario
Nahuel
Hacker del Foro
Mensajes: 194
Registrado: 27 Jun 2007, 23:32
Ubicación: Argentina
Contactar:

Re: Macro clicks sobre objeto de color

Mensaje por Nahuel »

Yo hice para el otro foro una aplicación para ese propósito. Con Pausa se congela y con Insertar copia el código hexagesimal en el portapapeles. Tiene una lupa para ver mejor el área.
Pixel Color V2.ENG.exe.zip
(246.62 KiB) Descargado 472 veces
No te paso el código fuente porque es muy viejo y hay que hacerle muchas modificaciones.
No soy un hombre de plegarias, pero si estás en el cielo sálvame por favor Superman!
Avatar de Usuario
gna08
Hacker del Foro
Mensajes: 379
Registrado: 27 Sep 2008, 18:51
Ubicación: Cordoba, Argentina

Re: Macro clicks sobre objeto de color

Mensaje por gna08 »

Uh nahuel, k tal, vi tu programa k subiste, keria sber si no me donas el codigo, aunqque alla k cambiar algunas cosas, o si no las parte de la lupa :), k magnifica, es para un proyecto distinto, bueno gracias! :smt006
Aunk no m Buskes, Seguro m enkontras!
Avatar de Usuario
Nahuel
Hacker del Foro
Mensajes: 194
Registrado: 27 Jun 2007, 23:32
Ubicación: Argentina
Contactar:

Re: Macro clicks sobre objeto de color

Mensaje por Nahuel »

Seguro. Estaba aburrido y lo arreglé para que funcione con la última versión de Autoit. Me olvidé mencionar que también tiene función para mover el cursor con las flechas. Shift+flechas mueve más rápido.

El 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
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: Macro clicks sobre objeto de color

Mensaje por Chefito »

Muy buen programa Nahuel!!! :smt023 . Y muy buenas funciones las de Larrydalooza.
Te animo a que pongas este programa en el subforo de esScripts :smt004 , porque merece estar allí :smt002 .

Yo ya había imaginado de como hacerlo. Pero lo que no se me ocurrió fue mostrar la lupa en el tooltips_class32. Eso ha sido muy bueno :smt023 . Muy buena idea.

A mi se me ocurrió utilizar las funciones Udf de GDI+ para hacer esto. Y pensé que habías utilizado una ventana transparente con un control pic al lado del cursor para mostrar la lupa. Pero lo del tooltip es buenísimo y mucho mejor.

Si tengo ganas lo intento hacer como he dicho a ver si es posible.......ya sabes que me gusta dar otras opciones :smt005 , aunque el tuyo va de película :smt023 .

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
Nahuel
Hacker del Foro
Mensajes: 194
Registrado: 27 Jun 2007, 23:32
Ubicación: Argentina
Contactar:

Re: Macro clicks sobre objeto de color

Mensaje por Nahuel »

Muchas gracias :) Ahora mismo lo pongo.
No soy un hombre de plegarias, pero si estás en el cielo sálvame por favor Superman!
Responder