Pixel Predator - Pixel Search Script

Post your working scripts, libraries and tools
Hellbent
Posts: 400
Joined: 23 Sep 2017, 13:34

Pixel Predator - Pixel Search Script

12 Jan 2019, 12:56

Here is a simple pixel search script.
It clicks / moves / sends keystrokes

Set-up and use is very easy, just click the " ? " to see the list of value meanings.

Code: Select all

/*
	Written By: Hellbent aka CivReborn (YouTube)
	Date Started: Dec 6th, 2018
	Date of last edit: Dec 16th, 2018
	Pixel Predator pixel search script. v1.0.1
	First Pastebin Copy:    https://pastebin.com/6pyq12fB
	Newest Pastebin Copy:   https://pastebin.com/raw/6pyq12fB
*/
SetUp()
pButton_StartUp() 
global pButton:={},pCheckBox:={},pRadio:={},Press_active:=0,Hover_On:=0,Active_Button,Pos_Setting_Active:=0,Variation:=0,Color_Edit:="0x7200FF",Stop:=1,cx2:="",cy2:="",X_Pos:="",Y_Pos:="",Active:=0
,Tips_Text:="Format`n *Click or Move*Number of clicks*X position offset*Y position offset*What mouse Button*loop*Normal Send Command `n The following is an example of setting up to click 1 time per loop with a x and y offset of 10px clicking with the left mouse button and having it loop`n`n*1*1*10*10*Left*1*"
global Commands:="",x,y,Delay:=150,M_Delay:=100,cx:="",cy:="",Key_Delay:=150
tips_Text =
(% ` Join`r`n
	Format: *1*2*3*4*5*6*7*8*9*10
	
			*1*	-----	Turn On/Off Search Loop (Values: 0 [Don't loop]  , 1 [Loop Forever])
			*2*		Click or Move (Range: 0-1)
			*3*		Number of clicks per loop (Range 1+)
			*4*	-----	X-Offset 
			*5*		Y-Offset
			*6*	-----	Which Mouse Button to use  (Values: L , M , R )
			*7* 	-----	Amount of time a click is held (in ms)
			*8*		Amount of time between key strokes (in ms)
			*9*	-----	How long to wait between click loops (in ms)
			*10		Commands to "send" (e.g. {Enter} r) See Documentation For List of values
			
	Set *2*3* both to a value of 0 to disable click / move 
	
	Set *1*2*3* all to a value of 0 to loop once with click /move disabled
	
	
	
)
Build_GUI()
return

GuiClose:
	GDip_Shutdown(pToken)
	ExitApp
SetUp(){
	global
	#SingleInstance,Force
	SetBatchLines,-1
	SetMouseDelay,M_Delay
	SetDefaultMouseSpeed,0
	SetKeyDelay,Key_Delay ,10
	Coordmode,Mouse,Screen
	Coordmode,Pixel,Screen
	SetControlDelay, -1
	ListLines,off
	OnExit,GuiClose
}
Build_GUI(){
	global
	Gui_Width:=450,Gui_Height:=300,Shadow_Color:=888888,Shadow_Color3:=000000,Shadow_Color2:="Black",Selected_Color:="7200FF"
	Gui,1:+AlwaysOnTop -DPIScale -Caption
	Gui,1:Color,222222
	Gui,1:Font,cBlack s10 Bold Q5,Segoe UI 
	Gui,1:Add,Progress,x0 y0 w%Gui_Width% h2 Background%Shadow_Color% c%Shadow_Color%,100
	Gui,1:Add,Progress,x0 y0 w2 h%Gui_Height% Background%Shadow_Color% c%Shadow_Color%,100
	Gui,1:Add,Progress,x0 y298 w%Gui_Width% h2 Background%Shadow_Color3% c%Shadow_Color3%,100
	Gui,1:Add,Progress,x448 y0 w2 h%Gui_Height% Background%Shadow_Color3% c%Shadow_Color3%,100
	pButton.Push(New Progress_Button("1",pButton.Length()+1,"Tag",6,6,25,25,"PURPLE","888888","7200FF","B400FF","B400FF","HB",4))
	Gui,1:Font,cBlack s14 Q5,Segoe UI 
	pButton.Push(New Progress_Button("1",pButton.Length()+1,"Win_Move",80,6,290,30,"PURPLE","888888","7200FF","B400FF","red","Pixel Predator",3))
	Gui,1:Font,cBlack s10  Q5,Segoe UI 
	pButton.Push(New Progress_Button("1",pButton.Length()+1,"Win_Min",410,5,15,15,"PURPLE","888888","7200FF","B400FF","red","_",-4))
	pButton.Push(New Progress_Button("1",pButton.Length()+1,"GuiClose",430,5,15,15,"PURPLE","888888","7200FF","ff0000","red","X",-1))
	Gui,1:Show,w%Gui_Width% h%Gui_Height%,Pixel Clicker v1.0.1
	Gui,2:+AlwaysOnTop -Caption -DPIScale +Parent1
	Gui,2:Color,333333 ,Black
	Gui,2:Add,Progress,x0 y0 w%Gui_Width% h3 Background%Shadow_Color2% c%Shadow_Color2%,100
	Gui,2:Add,Progress,x0 y0 w3 h%Gui_Height% Background%Shadow_Color2% c%Shadow_Color2%,100
	Gui,2:Add,Progress,x2 y248 w%Gui_Width% h3 Background%Shadow_Color% c%Shadow_Color%,100
	Gui,2:Add,Progress,x428 y2 w3 h%Gui_Height% Background%Shadow_Color% c%Shadow_Color%,100
	Gui,2:Font,cBlack s10 bold,Segoe UI  
	Gui,2:Add,Progress,x10 y5 w410 h5 Background5618E4 c000000,100
	Gui,2:Add,Progress,x10 y50 w410 h5 Background5618E4 c000000,100
	Gui,2:Add,Progress,x10 y95 w410 h5 Background5618E4 c000000,100
	Gui,2:Add,Progress,x10 y140 w410 h5 Background5618E4 c000000,100
	Gui,2:Add,Progress,x10 y180 w410 h5 Background5618E4 c000000,100
	Gui,2:Font,cBlack s10 Q5,Segoe UI Black
	pButton.Push(New Progress_Button("2",pButton.Length()+1,"Get_Color",30,15,110,30,"Black","bbbbbb","5618E4","7200FF","aa00ff","Set Colour",6))
	Gui,2:Add,Progress,x150 y15 w50 h30 BackgroundBlack c%Selected_Color% vSelected_Color,100
	pButton.Push(New Progress_Button("2",pButton.Length()+1,"Set_Position",20,60,110,30,"Black","bbbbbb","5618E4","7200FF","aa00ff","Set Position",6))
	Gui,2:Font,cWhite s10 Q5,Segoe UI
	Gui,2:Add,Edit,x210 y20 w80 h20 -E0x200 vColor_Edit gSubmit_All,% Color_Edit
	Gui,2:Add,Text,x300 y20 w40 h20 0x200 ,Var:
	Gui,2:Add,Edit,x340 y20 w40 h20 -E0x200 vVariation gSubmit_All,0
	Gui,2:Add,Text,x140 y65 w20 h20 0x200,X:
	Gui,2:Add,Edit,x160 y65 w40 h20 -E0x200 Number vX_Pos gSubmit_All
	Gui,2:Add,Text,x210 y65 w20 h20 0x200,Y:
	Gui,2:Add,Edit,x230 y65 w40 h20 -E0x200 Number vY_Pos gSubmit_All
	Gui,2:Add,Text,x280 y65 w20 h20 0x200,W:
	Gui,2:Add,Edit,x300 y65 w40 h20 -E0x200 Number vW_Pos gSubmit_All
	Gui,2:Add,Text,x350 y65 w20 h20 0x200,H:
	Gui,2:Add,Edit,x370 y65 w40 h20 -E0x200 Number vH_Pos gSubmit_All
	Gui,2:Font,cBlack s10 Q5,Segoe UI
	pRadio[1]:=New Progress_Radio(2,"Set_True","Set_Truth",1,"Truth",20,110,100,20,-62,1,"White","Black","5618E4","222222","True",1,1)
	pRadio[2]:=New Progress_Radio(2,"Set_False","Set_Truth",0,"Truth",130,110,100,20,-64,1,"White","Black","5618E4","222222","False",1,1)
	pButton.Push(New Progress_Button("2",pButton.Length()+1,"AHK_Send_Page",255,105,150,30,"Black","bbbbbb","5618E4","7200FF","aa00ff","Documentation",6))
	Gui,2:Font,cWhite s8 Q5,Segoe UI
	Gui,2:Add,Edit,x20 y148 w276 h30 -E0x200 -VScroll vCommands gSubmit_All,
	Gui,2:Font,cBlack s10 Q5,Segoe UI
	pButton.Push(New Progress_Button("2",pButton.Length()+1,"Defall",306,151,24,24,"Black","bbbbbb","5618E4","7200FF","aa00ff","C",4))
	pButton.Push(New Progress_Button("2",pButton.Length()+1,"DefallM",336,151,24,24,"Black","bbbbbb","5618E4","7200FF","aa00ff","M",4))
	pButton.Push(New Progress_Button("2",pButton.Length()+1,"DefallT",366,151,24,24,"Black","bbbbbb","5618E4","7200FF","aa00ff","T",4))
	pButton.Push(New Progress_Button("2",pButton.Length()+1,"Tips",396,151,24,24,"Black","bbbbbb","5618E4","7200FF","aa00ff","?",4))
	pButton.Push(New Progress_Button("2",pButton.Length()+1,"Start_Search",10,190,130,30,"Black","bbbbbb","5618E4","7200FF","aa00ff","Start",6))
	pButton.Push(New Progress_Button("2",pButton.Length()+1,"Stop_Search",150,190,130,30,"Black","bbbbbb","5618E4","7200FF","aa00ff","Stop",6))
	pButton.Push(New Progress_Button("2",pButton.Length()+1,"Reload",290,190,130,30,"Black","bbbbbb","5618E4","7200FF","aa00ff","Reload",6))
	Gui,2:Font,cWhite s10 Q5,Segoe UI
	Gui,2:Add,Text,x10 y225 w410 h20 center BackgroundTrans,Start :: NumPad1 <---> Stop :: Esc <---> Exit :: Ctrl+Esc
	Gui,2:Show,x10 y40 w430 h250
}
Defall:
	if(!pButton[A_GuiControl].Button_Press()) 
		return
	GuiControl,2:,Commands,*1*1*1*10*10*Left*%M_Delay%*%Key_Delay%*%Delay%*
	return
DefallM:
	if(!pButton[A_GuiControl].Button_Press()) 
		return
	GuiControl,2:,Commands,*1*0*1*10*10*Left*%M_Delay%*%Key_Delay%*%Delay%*
	return
DefallT:
	if(!pButton[A_GuiControl].Button_Press()) 
		return
	GuiControl,2:,Commands,*1*0*0*10*10*Left*%M_Delay%*%Key_Delay%*%Delay%*
	return	
Tips:
	if(!pButton[A_GuiControl].Button_Press()) 
		return
	Gui,Tips:Destroy
	Gui,Tips:+AlwaysOnTop +Owner1 -DPIScale
	Gui,Tips:Color,7200ff
	
	Gui,Tips:Font,cBlack s10 bold Q5,Segoe UI

	Gui,Tips:Add,Edit,x10 y10 w1000 -VScroll ReadOnly,% Tips_Text
	Gui,Tips:Show,x0 y0 NA,Tips
	return	
Start_Search:
	if(!pButton[A_GuiControl].Button_Press()) 
		return
	Gui,2:Submit,NoHide
	Run_Search()
	return
Numpad1::
Run_Search(){
	Stop:=0
	Active:=1		
	While(!Stop){
			PixelSearch,x,y,X_Pos,Y_Pos,cx2,cy2,Color_Edit,Variation,Fast|RGB
		if(ErrorLevel=0&&pRadio[1].State=1){
			stringleft,tep,Commands,1
			if(tep="*"){
				CMove:="",CTimes:="",XOff:="",YOff:="",TypeC:="Left",RTimes:=1,Send_Stuff:=""
				Loop, Parse, Commands,*
					{
						(A_Index=2)?(RTimes:=A_LoopField)
						:(A_Index=3)?(CMove:=A_LoopField)
						:(A_Index=4)?(CTimes:=A_LoopField)
						:(A_Index=5)?(XOff:=A_LoopField)
						:(A_Index=6)?(YOff:=A_LoopField)
						:(A_Index=7)?(TypeC:=A_LoopField)
						:(A_Index=8)?(M_Delay:=A_LoopField)
						:(A_Index=9)?(Key_Delay:=A_LoopField)
						:(A_Index=10)?(Delay:=A_LoopField)
						:(A_Index=11)?(Send_Stuff:=A_LoopField)
					}
					SetKeyDelay,Key_Delay ,10
					SetMouseDelay,M_Delay
				ClickingFun(CMove,CTimes,XOff,YOff,TypeC,x,y)
				if(Send_Stuff){
					Send,% Send_Stuff
				}
				if(RTimes!=1)
					gosub,Stop_P2
				
			}else if(tep!="*"){
				Send,%Commands%
			}
			Sleep, Delay
		}
		else if(ErrorLevel=1&&pRadio[2].State=1){
			stringleft,tep,Commands,1
			if(tep="*"){
				CMove:="",CTimes:="",XOff:="",YOff:="",TypeC:="Left",RTimes:=1,Send_Stuff:=""
				Loop, Parse, Commands,*
					{
						(A_Index=2)?(RTimes:=A_LoopField)
						:(A_Index=3)?(CMove:=A_LoopField)
						:(A_Index=4)?(CTimes:=A_LoopField)
						:(A_Index=5)?(XOff:=A_LoopField)
						:(A_Index=6)?(YOff:=A_LoopField)
						:(A_Index=7)?(TypeC:=A_LoopField)
						:(A_Index=8)?(M_Delay:=A_LoopField)
						:(A_Index=9)?(Key_Delay:=A_LoopField)
						:(A_Index=10)?(Delay:=A_LoopField)
						:(A_Index=11)?(Send_Stuff:=A_LoopField)
					}
					SetKeyDelay,Key_Delay ,10
					SetMouseDelay,M_Delay
				ClickingFun(CMove,CTimes,XOff,YOff,TypeC,x,y)
				if(Send_Stuff){
					Send,% Send_Stuff
				if(RTimes!=1)
					gosub,Stop_P2
				}
			}else if(tep!="*"){
				Send,%Commands%
			}
			Sleep, Delay
		}
	}
	Tooltip,
}
return


ClickingFun(CMove,CTimes,XOff,YOff,TypeC,x,y){
	if((CTimes=0&&CMove=0)||(CTimes=""&&CMove="")){
		return
	}
	x3:=x+XOff,y3:=y+YOff
	MouseMove, x3 , y3
	if(CMove=1){
		if(CTimes>1){
			Loop,% CTimes
			Click, %TypeC%,
		}
		else
			Click, %TypeC%,
	}	
}
#if (Active)
*Esc::
	gosub,Stop_P2
	return
#If
Stop_Search:
	if(!pButton[A_GuiControl].Button_Press()) 
		return
Stop_P2:	
	Stop:=1
	Active:=0
	return
Reload:
	if(!pButton[A_GuiControl].Button_Press()) 
		return
	Reload
	return
Set_Truth:
	Stop:=1
	Loop 2
		{
			if(pRadio[A_Index].Name=A_GuiControl){
				Swap_Radio_State(A_GuiControl)
			}
		}
	return
AHK_Send_Page:
	Stop:=1
	if(!pButton[A_GuiControl].Button_Press()) 
		return
	Try
		run,https://autohotkey.com/docs/commands/Send.htm
	return
Submit_All:
	Stop:=1
	Gui,2:Submit,NoHide
	GuiControl,2:+c%Color_Edit%,Selected_Color
	return
Tag:
	Stop:=1
	if(!pButton[A_GuiControl].Button_Press()) 
		return
	Try
		Run,https://www.youtube.com/user/CivReborn
	return
Win_Min:
	Gui,1:Minimize
	return	
Win_Move:
	PostMessage,0xA1,2
	while(Getkeystate("LButton"))
		SetTimer,Watch_Hover,off
	SetTimer,Watch_Hover,10
	return	
Get_Color:
	Stop:=1
	if(!pButton[A_GuiControl].Button_Press()) 
		return
	While(!GetKeyState("ctrl")){
		MouseGetPos,tx,ty
		PixelGetColor,Selected_Color,tx,ty,RGB
		ToolTip,Press ""ctrl"" to set colour
		GuiControl,2:+c%Selected_Color%,Selected_Color
		GuiControl,2:,Color_Edit,%Selected_Color%
	}
	tooltip,
	return	
Set_Position:
	Stop:=1
	if(!pButton[A_GuiControl].Button_Press()) 
		return
	SPOS()
	return	
SPOS(){
	global
	if(!pToken)
		pToken:=GDip_Startup()
	Gui,3:-Caption -DPIScale +LastFound +E0x80000 +ToolWindow +AlwaysOnTop
	Gui,3:Show,x0 y0 w%A_ScreenWidth% h%A_ScreenHeight% NA
	hwnd1:=WinExist(),hbm := CreateDIBSection(A_ScreenWidth,A_ScreenHeight),hdc := CreateCompatibleDC(),obm := SelectObject(hdc,hbm)
	G := Gdip_GraphicsFromHDC(hdc),Gdip_SetSmoothingMode(G,4),UpdateLayeredWindow(hwnd1, hdc, 0, 0,A_ScreenWidth,A_ScreenHeight)
	Br1:=New_Brush("ff0066","ff"),Br2:=New_Brush("12e854","55"),Br3:=New_Brush("de0d0a","aa")
	UpdateLayeredWindow(hwnd1, hdc),Pos_Setting_Active:=1,TL:=1
	SetTimer,Draw_Cross,10
}
Draw_Cross:
	Gdip_GraphicsClear(G)
	if(TL=1){
		MouseGetPos,cx,cy
		Fill_Box(G,Br1,0,cy,A_ScreenWidth,1),Fill_Box(G,Br1,cx,0,1,A_ScreenHeight)
		GuiControl,2:,X_Pos,% cx
		GuiControl,2:,Y_Pos,% cy
	}
	else if(TL=2){
		MouseGetPos,cx2,cy2
		if(cx2-cx>=0&&cy2-cy>=0){
			OB:=0
			Fill_Box(G,Br1,0,cy2,A_ScreenWidth,1),Fill_Box(G,Br1,cx2,0,1,A_ScreenHeight),Fill_Box(G,Br1,0,cy,A_ScreenWidth,1)
			Fill_Box(G,Br1,cx,0,1,A_ScreenHeight),Fill_Box(G,Br2,cx,cy,cx2-cx,cy2-cy)
			GuiControl,2:,W_Pos,% cx2 - cx
			GuiControl,2:,H_Pos,% cy2 - cy
		}
		else if(cx2-cx>=0&&cy2-cy<0){
			OB:=1
			Fill_Box(G,Br1,0,cy2,A_ScreenWidth,1),Fill_Box(G,Br1,cx2,0,1,A_ScreenHeight),Fill_Box(G,Br1,0,cy,A_ScreenWidth,1)
			Fill_Box(G,Br1,cx,0,1,A_ScreenHeight),Fill_Box(G,Br3,cx,cy2,cx2-cx,cy-cy2)
			GuiControl,2:,W_Pos,% (cx2 - cx)
			GuiControl,2:,H_Pos,% (cy2 - cy)*-1
		}
		else if(cx2-cx<0&&cy2-cy>=0){
			OB:=1
			Fill_Box(G,Br1,0,cy2,A_ScreenWidth,1),Fill_Box(G,Br1,cx2,0,1,A_ScreenHeight),Fill_Box(G,Br1,0,cy,A_ScreenWidth,1)
			Fill_Box(G,Br1,cx,0,1,A_ScreenHeight),Fill_Box(G,Br3,cx2,cy,cx-cx2,cy2-cy)
			GuiControl,2:,W_Pos,% (cx2 - cx)*-1
			GuiControl,2:,H_Pos,% (cy2 - cy)
		}
		else if(cx2-cx<0&&cy2-cy<0){
			OB:=1
			Fill_Box(G,Br1,0,cy2,A_ScreenWidth,1),Fill_Box(G,Br1,cx2,0,1,A_ScreenHeight),Fill_Box(G,Br1,0,cy,A_ScreenWidth,1)
			Fill_Box(G,Br1,cx,0,1,A_ScreenHeight),Fill_Box(G,Br3,cx2,cy2,cx-cx2,cy-cy2)
			GuiControl,2:,W_Pos,% (cx2 - cx)*-1
			GuiControl,2:,H_Pos,% (cy2 - cy)*-1
		}
	}
	UpdateLayeredWindow(hwnd1, hdc)	
	return


#If (Pos_Setting_Active=1)
*Lbutton::
	if(TL=1)
		TL:=2
	else if(TL=2&&OB=0){
		Gui,3:Destroy
		Pos_Setting_Active:=0,GDip_Shutdown(pToken),pToken:=""
		SetTimer,Draw_Cross,Off
	}
	return
#If

pButton_StartUp(){
	SetTimer,Watch_Hover,10
}
Watch_Hover(){
	global
	if(Press_active=0){
		if(Hover_On=0){
			MouseGetPos,,,,ctrl,2
			loop,% pButton.Length()	{
				GuiControlGet,cName,% pButton[A_Index].Window_Name ":Name",% ctrl
				cut:=Strlen(cName)
				StringLeft,bName,cName,cut-2
				if(bname=pButton[A_Index].Button_Name){
					pButton[A_Index].Button_Hover_On(),Hover_On:=1,Active_Button:=bname,win:=pButton[A_Index].Window_Name
					return
				}
		}
		}else if(Hover_On=1){
			MouseGetPos,,,,ctrl,2
			GuiControlGet,cName,%win%:Name,% ctrl
			cut:=Strlen(cName)
			StringLeft,nBName,cName,cut-2
			if(NbName!=Active_Button){
				pButton[Active_Button].Button_Hover_Off()
				Hover_On:=0,Active_Button:=""
			}
		}
	}
}

Class Progress_Button	{
		__New(Window_Name,Button_Name,Label,x,y,w,h,BC,TRC,TC1,TC2,TC3,Button_Text,Text_Offset:=0)
			{
				This.Text_Offset:=Text_Offset
				This.Window_Name:=Window_Name
				This.Button_Name:=Button_Name
				This.Label:=Label
				This.Button_ID1:=Button_Name "_1"
				This.Button_ID2:=Button_Name "_2"
				This.Button_ID3:=Button_Name "_3"
				This.Button_ID4:=Button_Name "_4"
				This.Button_Text:=Button_Text
				This.X:=x
				This.Y:=y
				This.W:=w
				This.H:=h
				This.Bottom_Color:=BC
				This.Trim_Color:=TRC
				This.Top_Color_1:=TC1
				This.Top_Color_2:=TC2
				This.Top_Color_3:=TC3
				This.Add_Button()
			}
		Add_Button()
			{
				global
				Gui,% This.Window_Name ":Add",Text,% "x" This.X " y" This.Y " w" This.W " h" This.H " v" This.Button_Name " g" This.Label
				Gui,% This.Window_Name ":Add",Progress,% "x" This.X " y" This.Y " w" This.W " h" This.H " Background" This.Bottom_Color " v" This.Button_ID1
				Gui,% This.Window_Name ":Add",Progress,% "x" This.X " y" This.Y " w" This.W-1 " h" This.H-1 " Background" This.Trim_Color " v" This.Button_ID2
				Gui,% This.Window_Name ":Add",Progress,% "x" This.X+1 " y" This.Y+1 " w" This.W-2 " h" This.H-2 " Background" This.Top_Color_1 " v" This.Button_ID3
				Gui,% This.Window_Name ":Add",Text,% "x" This.X+1 " y" This.Y+This.Text_Offset " w" This.W-2 " r1 Center BackgroundTrans v" This.Button_ID4,% This.Button_Text
			}
		Button_Press()
			{
				global
				Press_Active:=1
				GuiControl,% This.Window_Name ":Move",% This.Button_ID4,% "x" This.X+1 " y" This.Y+1+This.Text_Offset
				sleep,-1
				GuiControl,% This.Window_Name ":Hide",This.Button_ID2
				GuiControl,% This.Window_Name ":+Background" This.Top_Color_3,% This.Button_ID3
				GuiControl,% This.Window_Name ":+Redraw",% This.Button_ID1
				GuiControl,% This.Window_Name ":+Redraw",% This.Button_ID3
				GuiControl,% This.Window_Name ":+Redraw",% This.Button_ID4
				While(GetKeyState("LButton"))
					Sleep, 10
				MouseGetPos,,,,ctrl,2
				GuiControlGet,cName,% win ":Name",% ctrl
				cut:=Strlen(cName)
				StringLeft,bName,cName,cut-2
				if(bname=This.Button_Name)
					{
						GuiControl,% This.Window_Name ":Show",This.Button_ID2
						GuiControl,% This.Window_Name ":+Background" This.Top_Color_1,% This.Button_ID3
						GuiControl,% This.Window_Name ":+Redraw",% This.Button_ID1
						GuiControl,% This.Window_Name ":+Redraw",% This.Button_ID2
						GuiControl,% This.Window_Name ":+Redraw",% This.Button_ID3
						GuiControl,% This.Window_Name ":Move",% This.Button_ID4,% "x" This.X " y" This.Y+This.Text_Offset
						GuiControl,% This.Window_Name ":+Redraw",% This.Button_ID4
						%bName%.Button_Hover_On()
						Hover_On:=0
						Active_Button:=bname
						Press_Active:=0
						sleep,10
						return true
					}
				GuiControl,% This.Window_Name ":Show",This.Button_ID2
				GuiControl,% This.Window_Name ":Move",% This.Button_ID4,% "x" This.X " y" This.Y+This.Text_Offset
				GuiControl,% This.Window_Name ":+Background" This.Top_Color_1,% This.Button_ID3
				GuiControl,% This.Window_Name ":+Redraw",% This.Button_ID1
				GuiControl,% This.Window_Name ":+Redraw",% This.Button_ID2
				GuiControl,% This.Window_Name ":+Redraw",% This.Button_ID3
				GuiControl,% This.Window_Name ":+Redraw",% This.Button_ID4
				Hover_On:=0
				Press_Active:=0
				sleep,10
				return False
			}
		Button_Hover_On(){
			global
			GuiControl,% This.Window_Name ":+Background" This.Top_Color_2,% This.Button_ID3
			GuiControl,% This.Window_Name ":+Redraw",% This.Button_ID4
		}
		Button_Hover_Off()
			{
				global
				GuiControl,% This.Window_Name ":+Background" This.Top_Color_1,% This.Button_ID3
				GuiControl,% This.Window_Name ":+Redraw",% This.Button_ID4
			}
	}	
Get_Name(Name){
	global
	Loop, % pCheckBox.Length()
		if(Name=pCheckBox[A_Index].Name||Name=pCheckBox[A_Index].Checkbox_ID4){
			pCheckBox[A_Index].UpDate_CheckBox()
			break
		}
}
Class Progress_CheckBox	{
	__New(Window_Name,Checkbox_Name,Label,Start_State,x,y,w,h,Text_X_Offset,Text_Y_Offset,Outer_Color,Inner_Color,Check_On_Colour,Check_Off_Colour,Check_Box_Text,Outer_Thickness:=1,Inner_Thickness:=1){
		This.X:=x,This.Y:=y,This.W:=w,This.H:=h
		This.Text_X_Offset:=Text_X_Offset,This.Text_Y_Offset:=Text_Y_Offset
		This.Outer_Thickness:=Outer_Thickness,This.Inner_Thickness:=Inner_Thickness
		This.Outer_Trim_Colour:=Outer_Color,This.Inner_Trim_Colour:=Inner_Color
		This.Check_On_Colour:=Check_On_Colour,This.Check_Off_Colour:=Check_Off_Colour
		This.Name:=Checkbox_Name,This.Checkbox_ID1:=This.Name "_1",This.Checkbox_ID2:=This.Name "_2",This.Checkbox_ID3:=This.Name "_3",This.Checkbox_ID4:=This.Name "_4"
		This.Window_Name:=Window_Name,This.Label:=Label
		This.Outer_Trim_Thickness:=Outer_Thickness,This.Inner_Trim_Thickness:=Inner_Thickness
		This.Is_On:=Start_State,This.Text:=Check_Box_Text
		This.Add_CheckBox()
	}
	Add_CheckBox(){
		global
		Gui,% This.Window_Name ":Add",Text,% "x" This.X " y" This.Y " w" This.W " h" This.H " v" This.Name " g" This.Label
		Gui,% This.Window_Name ":Add",Progress,% "x" This.X " y" This.Y " w" This.W " h" This.H " BackGround" This.Outer_Trim_Colour " v" This.Checkbox_ID1 
		Gui,% This.Window_Name ":Add",Progress,% "x" This.X+This.Outer_Thickness " y" This.Y+This.Outer_Thickness " w" This.W-(2*This.Outer_Thickness) " h" This.H-(2*This.Outer_Thickness) " BackGround" This.Inner_Trim_Colour " v" This.Checkbox_ID2 
		(This.Is_On=1)?(col:=This.Check_On_Colour):(col:=This.Check_Off_Colour)
		Gui,% This.Window_Name ":Add",Progress,% "x" This.X+This.Outer_Thickness+This.Inner_Thickness " y" This.Y+This.Outer_Thickness+This.Inner_Thickness " w" This.W - ((2*This.Outer_Thickness)+(2*This.Inner_Thickness)) " h" This.H - ((2*This.Outer_Thickness)+(2*This.Inner_Thickness)) " BackGround" col " v" This.Checkbox_ID3 
		Gui,% This.Window_Name ":Add",Text,% "x" This.X+This.W+This.Text_X_Offset " y" This.Y+This.Text_Y_Offset " Backgroundtrans v" This.Checkbox_ID4 " g" This.Label,% This.Text
	}
	UpDate_CheckBox(){
		if(This.Is_On:=!This.Is_On){
			GuiControl,% This.Window_Name ":+Background" This.Check_On_Colour,% This.Checkbox_ID3 
			GuiControl,% This.Window_Name ":+Redraw",% This.Checkbox_ID4
		}else	{
			GuiControl,% This.Window_Name ":+Background" This.Check_Off_Colour,% This.Checkbox_ID3
			GuiControl,% This.Window_Name ":+Redraw",% This.Checkbox_ID4
		}
	}
}
Swap_Radio_State(Control){
	Loop, % pRadio.Length()
		if((Control=pRadio[A_Index].Name||Control=pRadio[A_Index].Radio_ID4)&&pRadio[A_Index].State!=1){
			pRadio[A_Index].Update_Radio()
			break
		}
}
class Progress_Radio	{
	__New(Window_Name,Radio_Name,Label,Start_State,Group_Name,x,y,w,h,Text_X_Offset,Text_Y_Offset,Outer_Color,Inner_Color,Radio_On_Colour,Radio_Off_Colour,Radio_Text,Outer_Thickness:=1,Inner_Thickness:=1){
		This.X:=x,This.Y:=y,This.W:=w,This.H:=h,This.Group:=Group_Name,This.Text_X_Offset:=Text_X_Offset,This.Text_Y_Offset:=Text_Y_Offset
		This.Outer_Thickness:=Outer_Thickness,This.Inner_Thickness:=Inner_Thickness,This.Outer_Trim_Colour:=Outer_Color,This.Inner_Trim_Colour:=Inner_Color
		This.Radio_On_Colour:=Radio_On_Colour,This.Radio_Off_Colour:=Radio_Off_Colour,This.Name:=Radio_Name,This.Radio_ID1:=This.Name "_1",This.Radio_ID2:=This.Name "_2",This.Radio_ID3:=This.Name "_3"
		This.Radio_ID4:=This.Name "_4",This.Window_Name:=Window_Name,This.Label:=Label,This.Outer_Trim_Thickness:=Outer_Thickness,This.Inner_Trim_Thickness:=Inner_Thickness
		This.State:=Start_State,This.Text:=Radio_Text
		This.Add_Radio()
	}
	Add_Radio(){
		global
		Gui,% This.Window_Name ":Add",Text,% "x" This.X " y" This.Y " w" This.W " h" This.H " v" This.Name " g" This.Label
		Gui,% This.Window_Name ":Add",Progress,% "x" This.X " y" This.Y " w" This.W " h" This.H " BackGround" This.Outer_Trim_Colour " v" This.Radio_ID1 
		Gui,% This.Window_Name ":Add",Progress,% "x" This.X+This.Outer_Thickness " y" This.Y+This.Outer_Thickness " w" This.W-(2*This.Outer_Thickness) " h" This.H-(2*This.Outer_Thickness) " BackGround" This.Inner_Trim_Colour " v" This.Radio_ID2 
		(This.State=1)?(col:=This.Radio_On_Colour):(col:=This.Radio_Off_Colour)
		Gui,% This.Window_Name ":Add",Progress,% "x" This.X+This.Outer_Thickness+This.Inner_Thickness " y" This.Y+This.Outer_Thickness+This.Inner_Thickness " w" This.W - ((2*This.Outer_Thickness)+(2*This.Inner_Thickness)) " h" This.H - ((2*This.Outer_Thickness)+(2*This.Inner_Thickness)) " BackGround" col " v" This.Radio_ID3 
		Gui,% This.Window_Name ":Add",Text,% "x" This.X+This.W+This.Text_X_Offset " y" This.Y+This.Text_Y_Offset " Backgroundtrans v" This.Radio_ID4 " g" This.Label,% This.Text
	}
	Update_Radio(){
		Loop,% pRadio.Length()	{
			if(pRadio[A_Index].State=1&&pRadio[A_Index].Group=This.Group){
				GuiControl,% pRadio[A_Index].Window_Name ":+Background" pRadio[A_Index].Radio_Off_Colour,% pRadio[A_Index].Radio_ID3 
				GuiControl,% pRadio[A_Index].Window_Name ":+Redraw",% pRadio[A_Index].Radio_ID4
				pRadio[A_Index].State:=0
			}
		}
		GuiControl,% This.Window_Name ":+Background" This.Radio_On_Colour,% This.Radio_ID3
		GuiControl,% This.Window_Name ":+Redraw",% This.Radio_ID4
		This.State:=1
	}
}
Gdip_DeleteBrush(pBrush)
{
   return DllCall("gdiplus\GdipDeleteBrush", A_PtrSize ? "UPtr" : "UInt", pBrush)
}
Gdip_DeletePen(pPen)
{
   return DllCall("gdiplus\GdipDeletePen", A_PtrSize ? "UPtr" : "UInt", pPen)
}
Gdip_DisposeImage(pBitmap)
{
   return DllCall("gdiplus\GdipDisposeImage", A_PtrSize ? "UPtr" : "UInt", pBitmap)
}
Layered_Window_ShutDown(This)
	{
		SelectObject(This.hdc,This.obm)
		DeleteObject(This.hbm)
		DeleteDC(This.hdc)
		gdip_deleteGraphics(This.g)
		Gdip_Shutdown(This.Token)
	}
UpdateLayeredWindow(hwnd, hdc, x="", y="", w="", h="", Alpha=255)
{
	Ptr := A_PtrSize ? "UPtr" : "UInt"
	
	if ((x != "") && (y != ""))
		VarSetCapacity(pt, 8), NumPut(x, pt, 0, "UInt"), NumPut(y, pt, 4, "UInt")

	if (w = "") ||(h = "")
		WinGetPos,,, w, h, ahk_id %hwnd%
   
	return DllCall("UpdateLayeredWindow"
					, Ptr, hwnd
					, Ptr, 0
					, Ptr, ((x = "") && (y = "")) ? 0 : &pt
					, "int64*", w|h<<32
					, Ptr, hdc
					, "int64*", 0
					, "uint", 0
					, "UInt*", Alpha<<16|1<<24
					, "uint", 2)
}
DeleteObject(hObject)
{
   return DllCall("DeleteObject", A_PtrSize ? "UPtr" : "UInt", hObject)
}
Gdip_CreateBitmap(Width, Height, Format=0x26200A)
{
    DllCall("gdiplus\GdipCreateBitmapFromScan0", "int", Width, "int", Height, "int", 0, "int", Format, A_PtrSize ? "UPtr" : "UInt", 0, A_PtrSize ? "UPtr*" : "uint*", pBitmap)
    Return pBitmap
}
Gdip_GraphicsFromImage(pBitmap)
{
	DllCall("gdiplus\GdipGetImageGraphicsContext", A_PtrSize ? "UPtr" : "UInt", pBitmap, A_PtrSize ? "UPtr*" : "UInt*", pGraphics)
	return pGraphics
}
Gdip_SetSmoothingMode(pGraphics, SmoothingMode)
{
   return DllCall("gdiplus\GdipSetSmoothingMode", A_PtrSize ? "UPtr" : "UInt", pGraphics, "int", SmoothingMode)
}
New_Brush(colour:="000000",Alpha:="FF")
	{
		static Hellbent_Brush:=[]
		new_colour := "0x" Alpha colour 
		Hellbent_Brush[Hellbent_Brush.Length()+1]:=Gdip_BrushCreateSolid(new_colour)
		return Hellbent_Brush[Hellbent_Brush.Length()]
	}
Fill_Box(pGraphics,pBrush,x,y,w,h)	
	{
		Ptr := A_PtrSize ? "UPtr" : "UInt"
		return DllCall("gdiplus\GdipFillRectangle"
					, Ptr, pGraphics
					, Ptr, pBrush
					, "float", x
					, "float", y
					, "float", w
					, "float", h)
	}
Gdip_CreateLineBrushFromRect(x, y, w, h, ARGB1, ARGB2, LinearGradientMode=1, WrapMode=1)
{
	CreateRectF(RectF, x, y, w, h)
	DllCall("gdiplus\GdipCreateLineBrushFromRect", A_PtrSize ? "UPtr" : "UInt", &RectF, "int", ARGB1, "int", ARGB2, "int", LinearGradientMode, "int", WrapMode, A_PtrSize ? "UPtr*" : "UInt*", LGpBrush)
	return LGpBrush
}
Gdip_TextToGraphics(pGraphics, Text, Options, Font="Arial", Width="", Height="", Measure=0)
{
	IWidth := Width, IHeight:= Height
	
	RegExMatch(Options, "i)X([\-\d\.]+)(p*)", xpos)
	RegExMatch(Options, "i)Y([\-\d\.]+)(p*)", ypos)
	RegExMatch(Options, "i)W([\-\d\.]+)(p*)", Width)
	RegExMatch(Options, "i)H([\-\d\.]+)(p*)", Height)
	RegExMatch(Options, "i)C(?!(entre|enter))([a-f\d]+)", Colour)
	RegExMatch(Options, "i)Top|Up|Bottom|Down|vCentre|vCenter", vPos)
	RegExMatch(Options, "i)NoWrap", NoWrap)
	RegExMatch(Options, "i)R(\d)", Rendering)
	RegExMatch(Options, "i)S(\d+)(p*)", Size)

	if !Gdip_DeleteBrush(Gdip_CloneBrush(Colour2))
		PassBrush := 1, pBrush := Colour2
	
	if !(IWidth && IHeight) && (xpos2 || ypos2 || Width2 || Height2 || Size2)
		return -1

	Style := 0, Styles := "Regular|Bold|Italic|BoldItalic|Underline|Strikeout"
	Loop, Parse, Styles, |
	{
		if RegExMatch(Options, "\b" A_loopField)
		Style |= (A_LoopField != "StrikeOut") ? (A_Index-1) : 8
	}
  
	Align := 0, Alignments := "Near|Left|Centre|Center|Far|Right"
	Loop, Parse, Alignments, |
	{
		if RegExMatch(Options, "\b" A_loopField)
			Align |= A_Index//2.1      ; 0|0|1|1|2|2
	}

	xpos := (xpos1 != "") ? xpos2 ? IWidth*(xpos1/100) : xpos1 : 0
	ypos := (ypos1 != "") ? ypos2 ? IHeight*(ypos1/100) : ypos1 : 0
	Width := Width1 ? Width2 ? IWidth*(Width1/100) : Width1 : IWidth
	Height := Height1 ? Height2 ? IHeight*(Height1/100) : Height1 : IHeight
	if !PassBrush
		Colour := "0x" (Colour2 ? Colour2 : "ff000000")
	Rendering := ((Rendering1 >= 0) && (Rendering1 <= 5)) ? Rendering1 : 4
	Size := (Size1 > 0) ? Size2 ? IHeight*(Size1/100) : Size1 : 12

	hFamily := Gdip_FontFamilyCreate(Font)
	hFont := Gdip_FontCreate(hFamily, Size, Style)
	FormatStyle := NoWrap ? 0x4000 | 0x1000 : 0x4000
	hFormat := Gdip_StringFormatCreate(FormatStyle)
	pBrush := PassBrush ? pBrush : Gdip_BrushCreateSolid(Colour)
	if !(hFamily && hFont && hFormat && pBrush && pGraphics)
		return !pGraphics ? -2 : !hFamily ? -3 : !hFont ? -4 : !hFormat ? -5 : !pBrush ? -6 : 0
   
	CreateRectF(RC, xpos, ypos, Width, Height)
	Gdip_SetStringFormatAlign(hFormat, Align)
	Gdip_SetTextRenderingHint(pGraphics, Rendering)
	ReturnRC := Gdip_MeasureString(pGraphics, Text, hFont, hFormat, RC)

	if vPos
	{
		StringSplit, ReturnRC, ReturnRC, |
		
		if (vPos = "vCentre") || (vPos = "vCenter")
			ypos += (Height-ReturnRC4)//2
		else if (vPos = "Top") || (vPos = "Up")
			ypos := 0
		else if (vPos = "Bottom") || (vPos = "Down")
			ypos := Height-ReturnRC4
		
		CreateRectF(RC, xpos, ypos, Width, ReturnRC4)
		ReturnRC := Gdip_MeasureString(pGraphics, Text, hFont, hFormat, RC)
	}

	if !Measure
		E := Gdip_DrawString(pGraphics, Text, hFont, hFormat, pBrush, RC)

	if !PassBrush
		Gdip_DeleteBrush(pBrush)
	Gdip_DeleteStringFormat(hFormat)   
	Gdip_DeleteFont(hFont)
	Gdip_DeleteFontFamily(hFamily)
	return E ? E : ReturnRC
}
Gdip_DrawImage(pGraphics, pBitmap, dx="", dy="", dw="", dh="", sx="", sy="", sw="", sh="", Matrix=1)
{
	Ptr := A_PtrSize ? "UPtr" : "UInt"
	
	if (Matrix&1 = "")
		ImageAttr := Gdip_SetImageAttributesColorMatrix(Matrix)
	else if (Matrix != 1)
		ImageAttr := Gdip_SetImageAttributesColorMatrix("1|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0|0|" Matrix "|0|0|0|0|0|1")

	if (sx = "" && sy = "" && sw = "" && sh = "")
	{
		if (dx = "" && dy = "" && dw = "" && dh = "")
		{
			sx := dx := 0, sy := dy := 0
			sw := dw := Gdip_GetImageWidth(pBitmap)
			sh := dh := Gdip_GetImageHeight(pBitmap)
		}
		else
		{
			sx := sy := 0
			sw := Gdip_GetImageWidth(pBitmap)
			sh := Gdip_GetImageHeight(pBitmap)
		}
	}

	E := DllCall("gdiplus\GdipDrawImageRectRect"
				, Ptr, pGraphics
				, Ptr, pBitmap
				, "float", dx
				, "float", dy
				, "float", dw
				, "float", dh
				, "float", sx
				, "float", sy
				, "float", sw
				, "float", sh
				, "int", 2
				, Ptr, ImageAttr
				, Ptr, 0
				, Ptr, 0)
	if ImageAttr
		Gdip_DisposeImageAttributes(ImageAttr)
	return E
}
Gdip_DeleteGraphics(pGraphics)
{
   return DllCall("gdiplus\GdipDeleteGraphics", A_PtrSize ? "UPtr" : "UInt", pGraphics)
}
Layered_Window_SetUp(Smoothing,Window_X,Window_Y,Window_W,Window_H,Window_Name:=1,Window_Options:="")
	{
		Layered:={}
		Layered.W:=Window_W
		Layered.H:=Window_H
		Layered.X:=Window_X
		Layered.Y:=Window_Y
		Layered.Name:=Window_Name
		Layered.Options:=Window_Options
		Layered.Token:=Gdip_Startup()
		Create_Layered_GUI(Layered)
		Layered.hwnd:=winExist()
		Layered.hbm := CreateDIBSection(Window_W,Window_H)
		Layered.hdc := CreateCompatibleDC()
		Layered.obm := SelectObject(Layered.hdc,Layered.hbm)
		Layered.G := Gdip_GraphicsFromHDC(Layered.hdc)
		Gdip_SetSmoothingMode(Layered.G,Smoothing)
		return Layered
	}
Gdip_GraphicsClear(pGraphics, ARGB=0x00ffffff)
{
    return DllCall("gdiplus\GdipGraphicsClear", A_PtrSize ? "UPtr" : "UInt", pGraphics, "int", ARGB)
}
New_Pen(colour:="000000",Alpha:="FF",Width:= 5)
	{
		static Hellbent_Pen:=[]
		new_colour := "0x" Alpha colour 
		Hellbent_Pen[Hellbent_Pen.Length()+1]:=Gdip_CreatePen(New_Colour,Width)
		return Hellbent_Pen[Hellbent_Pen.Length()]
	}
Gdip_DrawRectangle(pGraphics, pPen, x, y, w, h)
{
	Ptr := A_PtrSize ? "UPtr" : "UInt"
	
	return DllCall("gdiplus\GdipDrawRectangle", Ptr, pGraphics, Ptr, pPen, "float", x, "float", y, "float", w, "float", h)
}
Gdip_FillRoundedRectangle(pGraphics, pBrush, x, y, w, h, r)
{
	Region := Gdip_GetClipRegion(pGraphics)
	Gdip_SetClipRect(pGraphics, x-r, y-r, 2*r, 2*r, 4)
	Gdip_SetClipRect(pGraphics, x+w-r, y-r, 2*r, 2*r, 4)
	Gdip_SetClipRect(pGraphics, x-r, y+h-r, 2*r, 2*r, 4)
	Gdip_SetClipRect(pGraphics, x+w-r, y+h-r, 2*r, 2*r, 4)
	E := Gdip_FillRectangle(pGraphics, pBrush, x, y, w, h)
	Gdip_SetClipRegion(pGraphics, Region, 0)
	Gdip_SetClipRect(pGraphics, x-(2*r), y+r, w+(4*r), h-(2*r), 4)
	Gdip_SetClipRect(pGraphics, x+r, y-(2*r), w-(2*r), h+(4*r), 4)
	Gdip_FillEllipse(pGraphics, pBrush, x, y, 2*r, 2*r)
	Gdip_FillEllipse(pGraphics, pBrush, x+w-(2*r), y, 2*r, 2*r)
	Gdip_FillEllipse(pGraphics, pBrush, x, y+h-(2*r), 2*r, 2*r)
	Gdip_FillEllipse(pGraphics, pBrush, x+w-(2*r), y+h-(2*r), 2*r, 2*r)
	Gdip_SetClipRegion(pGraphics, Region, 0)
	Gdip_DeleteRegion(Region)
	return E
}
Gdip_DrawRoundedRectangle(pGraphics, pPen, x, y, w, h, r)
{
	Gdip_SetClipRect(pGraphics, x-r, y-r, 2*r, 2*r, 4)
	Gdip_SetClipRect(pGraphics, x+w-r, y-r, 2*r, 2*r, 4)
	Gdip_SetClipRect(pGraphics, x-r, y+h-r, 2*r, 2*r, 4)
	Gdip_SetClipRect(pGraphics, x+w-r, y+h-r, 2*r, 2*r, 4)
	E := Gdip_DrawRectangle(pGraphics, pPen, x, y, w, h)
	Gdip_ResetClip(pGraphics)
	Gdip_SetClipRect(pGraphics, x-(2*r), y+r, w+(4*r), h-(2*r), 4)
	Gdip_SetClipRect(pGraphics, x+r, y-(2*r), w-(2*r), h+(4*r), 4)
	Gdip_DrawEllipse(pGraphics, pPen, x, y, 2*r, 2*r)
	Gdip_DrawEllipse(pGraphics, pPen, x+w-(2*r), y, 2*r, 2*r)
	Gdip_DrawEllipse(pGraphics, pPen, x, y+h-(2*r), 2*r, 2*r)
	Gdip_DrawEllipse(pGraphics, pPen, x+w-(2*r), y+h-(2*r), 2*r, 2*r)
	Gdip_ResetClip(pGraphics)
	return E
}
Gdip_FillEllipse(pGraphics, pBrush, x, y, w, h)
{
	Ptr := A_PtrSize ? "UPtr" : "UInt"
	
	return DllCall("gdiplus\GdipFillEllipse", Ptr, pGraphics, Ptr, pBrush, "float", x, "float", y, "float", w, "float", h)
}
SelectObject(hdc, hgdiobj)
{
	Ptr := A_PtrSize ? "UPtr" : "UInt"
	
	return DllCall("SelectObject", Ptr, hdc, Ptr, hgdiobj)
}
DeleteDC(hdc)
{
   return DllCall("DeleteDC", A_PtrSize ? "UPtr" : "UInt", hdc)
}
Gdip_Shutdown(pToken)
{
	Ptr := A_PtrSize ? "UPtr" : "UInt"
	
	DllCall("gdiplus\GdiplusShutdown", Ptr, pToken)
	if hModule := DllCall("GetModuleHandle", "str", "gdiplus", Ptr)
		DllCall("FreeLibrary", Ptr, hModule)
	return 0
}
Gdip_BrushCreateSolid(ARGB=0xff000000)
{
	DllCall("gdiplus\GdipCreateSolidFill", "UInt", ARGB, A_PtrSize ? "UPtr*" : "UInt*", pBrush)
	return pBrush
}
CreateRectF(ByRef RectF, x, y, w, h)
{
   VarSetCapacity(RectF, 16)
   NumPut(x, RectF, 0, "float"), NumPut(y, RectF, 4, "float"), NumPut(w, RectF, 8, "float"), NumPut(h, RectF, 12, "float")
}
Gdip_CloneBrush(pBrush)
{
	DllCall("gdiplus\GdipCloneBrush", A_PtrSize ? "UPtr" : "UInt", pBrush, A_PtrSize ? "UPtr*" : "UInt*", pBrushClone)
	return pBrushClone
}
Gdip_FontFamilyCreate(Font)
{
	Ptr := A_PtrSize ? "UPtr" : "UInt"
	
	if (!A_IsUnicode)
	{
		nSize := DllCall("MultiByteToWideChar", "uint", 0, "uint", 0, Ptr, &Font, "int", -1, "uint", 0, "int", 0)
		VarSetCapacity(wFont, nSize*2)
		DllCall("MultiByteToWideChar", "uint", 0, "uint", 0, Ptr, &Font, "int", -1, Ptr, &wFont, "int", nSize)
	}
	
	DllCall("gdiplus\GdipCreateFontFamilyFromName"
					, Ptr, A_IsUnicode ? &Font : &wFont
					, "uint", 0
					, A_PtrSize ? "UPtr*" : "UInt*", hFamily)
	
	return hFamily
}
Gdip_FontCreate(hFamily, Size, Style=0)
{
   DllCall("gdiplus\GdipCreateFont", A_PtrSize ? "UPtr" : "UInt", hFamily, "float", Size, "int", Style, "int", 0, A_PtrSize ? "UPtr*" : "UInt*", hFont)
   return hFont
}
Gdip_StringFormatCreate(Format=0, Lang=0)
{
   DllCall("gdiplus\GdipCreateStringFormat", "int", Format, "int", Lang, A_PtrSize ? "UPtr*" : "UInt*", hFormat)
   return hFormat
}
Gdip_SetStringFormatAlign(hFormat, Align)
{
   return DllCall("gdiplus\GdipSetStringFormatAlign", A_PtrSize ? "UPtr" : "UInt", hFormat, "int", Align)
}
Gdip_SetTextRenderingHint(pGraphics, RenderingHint)
{
	return DllCall("gdiplus\GdipSetTextRenderingHint", A_PtrSize ? "UPtr" : "UInt", pGraphics, "int", RenderingHint)
}
Gdip_MeasureString(pGraphics, sString, hFont, hFormat, ByRef RectF)
{
	Ptr := A_PtrSize ? "UPtr" : "UInt"
	
	VarSetCapacity(RC, 16)
	if !A_IsUnicode
	{
		nSize := DllCall("MultiByteToWideChar", "uint", 0, "uint", 0, Ptr, &sString, "int", -1, "uint", 0, "int", 0)
		VarSetCapacity(wString, nSize*2)   
		DllCall("MultiByteToWideChar", "uint", 0, "uint", 0, Ptr, &sString, "int", -1, Ptr, &wString, "int", nSize)
	}
	
	DllCall("gdiplus\GdipMeasureString"
					, Ptr, pGraphics
					, Ptr, A_IsUnicode ? &sString : &wString
					, "int", -1
					, Ptr, hFont
					, Ptr, &RectF
					, Ptr, hFormat
					, Ptr, &RC
					, "uint*", Chars
					, "uint*", Lines)
	
	return &RC ? NumGet(RC, 0, "float") "|" NumGet(RC, 4, "float") "|" NumGet(RC, 8, "float") "|" NumGet(RC, 12, "float") "|" Chars "|" Lines : 0
}
Gdip_DrawString(pGraphics, sString, hFont, hFormat, pBrush, ByRef RectF)
{
	Ptr := A_PtrSize ? "UPtr" : "UInt"
	
	if (!A_IsUnicode)
	{
		nSize := DllCall("MultiByteToWideChar", "uint", 0, "uint", 0, Ptr, &sString, "int", -1, Ptr, 0, "int", 0)
		VarSetCapacity(wString, nSize*2)
		DllCall("MultiByteToWideChar", "uint", 0, "uint", 0, Ptr, &sString, "int", -1, Ptr, &wString, "int", nSize)
	}
	
	return DllCall("gdiplus\GdipDrawString"
					, Ptr, pGraphics
					, Ptr, A_IsUnicode ? &sString : &wString
					, "int", -1
					, Ptr, hFont
					, Ptr, &RectF
					, Ptr, hFormat
					, Ptr, pBrush)
}
Gdip_DeleteStringFormat(hFormat)
{
   return DllCall("gdiplus\GdipDeleteStringFormat", A_PtrSize ? "UPtr" : "UInt", hFormat)
}
Gdip_DeleteFont(hFont)
{
   return DllCall("gdiplus\GdipDeleteFont", A_PtrSize ? "UPtr" : "UInt", hFont)
}
Gdip_DeleteFontFamily(hFamily)
{
   return DllCall("gdiplus\GdipDeleteFontFamily", A_PtrSize ? "UPtr" : "UInt", hFamily)
}
Gdip_SetImageAttributesColorMatrix(Matrix)
{
	Ptr := A_PtrSize ? "UPtr" : "UInt"
	
	VarSetCapacity(ColourMatrix, 100, 0)
	Matrix := RegExReplace(RegExReplace(Matrix, "^[^\d-\.]+([\d\.])", "$1", "", 1), "[^\d-\.]+", "|")
	StringSplit, Matrix, Matrix, |
	Loop, 25
	{
		Matrix := (Matrix%A_Index% != "") ? Matrix%A_Index% : Mod(A_Index-1, 6) ? 0 : 1
		NumPut(Matrix, ColourMatrix, (A_Index-1)*4, "float")
	}
	DllCall("gdiplus\GdipCreateImageAttributes", A_PtrSize ? "UPtr*" : "uint*", ImageAttr)
	DllCall("gdiplus\GdipSetImageAttributesColorMatrix", Ptr, ImageAttr, "int", 1, "int", 1, Ptr, &ColourMatrix, Ptr, 0, "int", 0)
	return ImageAttr
}
Gdip_GetImageWidth(pBitmap)
{
   DllCall("gdiplus\GdipGetImageWidth", A_PtrSize ? "UPtr" : "UInt", pBitmap, "uint*", Width)
   return Width
}
Gdip_GetImageHeight(pBitmap)
{
   DllCall("gdiplus\GdipGetImageHeight", A_PtrSize ? "UPtr" : "UInt", pBitmap, "uint*", Height)
   return Height
}
Gdip_DisposeImageAttributes(ImageAttr)
{
	return DllCall("gdiplus\GdipDisposeImageAttributes", A_PtrSize ? "UPtr" : "UInt", ImageAttr)
}
Gdip_Startup()
{
	Ptr := A_PtrSize ? "UPtr" : "UInt"
	
	if !DllCall("GetModuleHandle", "str", "gdiplus", Ptr)
		DllCall("LoadLibrary", "str", "gdiplus")
	VarSetCapacity(si, A_PtrSize = 8 ? 24 : 16, 0), si := Chr(1)
	DllCall("gdiplus\GdiplusStartup", A_PtrSize ? "UPtr*" : "uint*", pToken, Ptr, &si, Ptr, 0)
	return pToken
}
Create_Layered_GUI(Layered)
	{
		Gui,% Layered.Name ": +E0x80000 +LastFound " Layered.Options 
		Gui,% Layered.Name ":Show",% "x" Layered.X " y" Layered.Y " w" Layered.W " h" Layered.H " NA"
	}
CreateDIBSection(w, h, hdc="", bpp=32, ByRef ppvBits=0)
{
	Ptr := A_PtrSize ? "UPtr" : "UInt"
	
	hdc2 := hdc ? hdc : GetDC()
	VarSetCapacity(bi, 40, 0)
	
	NumPut(w, bi, 4, "uint")
	, NumPut(h, bi, 8, "uint")
	, NumPut(40, bi, 0, "uint")
	, NumPut(1, bi, 12, "ushort")
	, NumPut(0, bi, 16, "uInt")
	, NumPut(bpp, bi, 14, "ushort")
	
	hbm := DllCall("CreateDIBSection"
					, Ptr, hdc2
					, Ptr, &bi
					, "uint", 0
					, A_PtrSize ? "UPtr*" : "uint*", ppvBits
					, Ptr, 0
					, "uint", 0, Ptr)

	if !hdc
		ReleaseDC(hdc2)
	return hbm
}
CreateCompatibleDC(hdc=0)
{
   return DllCall("CreateCompatibleDC", A_PtrSize ? "UPtr" : "UInt", hdc)
}
Gdip_GraphicsFromHDC(hdc)
{
    DllCall("gdiplus\GdipCreateFromHDC", A_PtrSize ? "UPtr" : "UInt", hdc, A_PtrSize ? "UPtr*" : "UInt*", pGraphics)
    return pGraphics
}
Gdip_CreatePen(ARGB, w)
{
   DllCall("gdiplus\GdipCreatePen1", "UInt", ARGB, "float", w, "int", 2, A_PtrSize ? "UPtr*" : "UInt*", pPen)
   return pPen
}
Gdip_GetClipRegion(pGraphics)
{
	Region := Gdip_CreateRegion()
	DllCall("gdiplus\GdipGetClip", A_PtrSize ? "UPtr" : "UInt", pGraphics, "UInt*", Region)
	return Region
}
Gdip_SetClipRect(pGraphics, x, y, w, h, CombineMode=0)
{
   return DllCall("gdiplus\GdipSetClipRect",  A_PtrSize ? "UPtr" : "UInt", pGraphics, "float", x, "float", y, "float", w, "float", h, "int", CombineMode)
}
Gdip_FillRectangle(pGraphics, pBrush, x, y, w, h)
{
	Ptr := A_PtrSize ? "UPtr" : "UInt"
	
	return DllCall("gdiplus\GdipFillRectangle"
					, Ptr, pGraphics
					, Ptr, pBrush
					, "float", x
					, "float", y
					, "float", w
					, "float", h)
}
Gdip_SetClipRegion(pGraphics, Region, CombineMode=0)
{
	Ptr := A_PtrSize ? "UPtr" : "UInt"
	
	return DllCall("gdiplus\GdipSetClipRegion", Ptr, pGraphics, Ptr, Region, "int", CombineMode)
}
Gdip_DeleteRegion(Region)
{
	return DllCall("gdiplus\GdipDeleteRegion", A_PtrSize ? "UPtr" : "UInt", Region)
}
Gdip_ResetClip(pGraphics)
{
   return DllCall("gdiplus\GdipResetClip", A_PtrSize ? "UPtr" : "UInt", pGraphics)
}
Gdip_DrawEllipse(pGraphics, pPen, x, y, w, h)
{
	Ptr := A_PtrSize ? "UPtr" : "UInt"
	
	return DllCall("gdiplus\GdipDrawEllipse", Ptr, pGraphics, Ptr, pPen, "float", x, "float", y, "float", w, "float", h)
}
GetDC(hwnd=0)
{
	return DllCall("GetDC", A_PtrSize ? "UPtr" : "UInt", hwnd)
}
ReleaseDC(hdc, hwnd=0)
{
	Ptr := A_PtrSize ? "UPtr" : "UInt"
	
	return DllCall("ReleaseDC", Ptr, hwnd, Ptr, hdc)
}
Gdip_CreateRegion()
{
	DllCall("gdiplus\GdipCreateRegion", "UInt*", Region)
	return Region
}
	
;Hotkeys
;------------------------------------------------------------------------
#If (Stop=0)	
*^ESC::ExitApp
#if

Here is a video demo of the script (The first half deals with setting clicks, the second half deals with sending keystrokes)



Enjoy.
SOTE
Posts: 495
Joined: 15 Jun 2015, 06:21

Re: Pixel Predator - Pixel Search Script

25 Jan 2019, 14:46

Impressive and great script.
SilentThunder
Posts: 4
Joined: 30 Jan 2019, 10:49

Re: Pixel Predator - Pixel Search Script

30 Jan 2019, 11:09

i love this and use it daily. I actually run multiple instances of it, which brings me to a question. if im running 2 or 3 instances of the pixel predator, is there a way to prioritize them? for example I have 3 colors on screen that need to be clicked on, but I need a specific color clicked before the others. atm they fumble over each other when I have more than one color needing to be clicked.

I hope u can help, I just recently started using scripts, I actually was just looking for an autoclicker when I stumbled upon ur youtube channel. you have opened up a whole world that I never knew existed.
and the way u explain everything is awesome cause i never knew of scripting till i seen ur videos.
DRocks
Posts: 400
Joined: 08 May 2018, 10:20

Re: Pixel Predator - Pixel Search Script

31 Jan 2019, 08:08

Holy shit that could ruin call of duty :D nixe stuff hellbent.

Thanks for all your contributions on youTube mainly.

You know because of you i had the courage to start scripting. You gave me the first steps that were necessary to not give up when beginning.
Hellbent
Posts: 400
Joined: 23 Sep 2017, 13:34

Re: Pixel Predator - Pixel Search Script

31 Jan 2019, 10:07

SOTE wrote:
25 Jan 2019, 14:46
Impressive and great script.
Thanks SOTE.
DRocks wrote:
31 Jan 2019, 08:08
Holy shit that could ruin call of duty :D nixe stuff hellbent.

Thanks for all your contributions on youTube mainly.

You know because of you i had the courage to start scripting. You gave me the first steps that were necessary to not give up when beginning.
lol lets hope not, and thanks DRocks.

SilentThunder wrote:
30 Jan 2019, 11:09
i love this and use it daily. I actually run multiple instances of it, which brings me to a question. if im running 2 or 3 instances of the pixel predator, is there a way to prioritize them? for example I have 3 colors on screen that need to be clicked on, but I need a specific color clicked before the others. atm they fumble over each other when I have more than one color needing to be clicked.

I hope u can help, I just recently started using scripts, I actually was just looking for an autoclicker when I stumbled upon ur youtube channel. you have opened up a whole world that I never knew existed.
and the way u explain everything is awesome cause i never knew of scripting till i seen ur videos.

This is a good news bad news situation. The bad news is that the amount of effort it would take to get this script to look for multiple colours is about the same amount of effort it would take to rewrite it from scratch. I will likely revisit this sometime down the road, but that could be 6 months to a year away.

The good news is that you can create your own pixel search script in minutes if you omit the Gui and just go with hotkeys.
You can also continue doing it the way you are now (using multiple instances of the script) and adjust the loop delay so that the colours you want to prioritize loop faster, this is not a very good solution, but it might be enough. I'm glad you like this script and i'm also very happy that I was able to bring you into the world of ahk scripting.

Good luck.
SilentThunder
Posts: 4
Joined: 30 Jan 2019, 10:49

Re: Pixel Predator - Pixel Search Script

31 Jan 2019, 10:18

ty for response. I haven't learned enough yet to make it myself, but im still watching ur videos and learning more everyday. I was using like u say with hotkeys from older video u had posted, im gonna keep watching ur vids and one day ill be able to do it. keep them vids coming, us noobs greatly appreciate it
luciga
Posts: 30
Joined: 01 Dec 2016, 08:52

Re: Pixel Predator - Pixel Search Script

01 Feb 2019, 14:44

Aaah.. How can I use the *10 command (send)?
I have 2 bars, 1 is red, the other is blue (life/mana)
If those bars are no longer red or blue, I need to press for example f1 to one and f2 to the other one with 1000 ms
Is it possible to do both bars in the same Pixel predator?
How do I add keyboard button on it?
Hellbent
Posts: 400
Joined: 23 Sep 2017, 13:34

Re: Pixel Predator - Pixel Search Script

15 Feb 2019, 14:09

luciga wrote:
01 Feb 2019, 14:44
Aaah.. How can I use the *10 command (send)?
For the most part you use it the same way you would use "Sendinput," in a script

So if you want to send F1 you would type {F1}
if you want to type in a edit, you would do something like this.

1. Before you run the script, get the coords for the edit, you will need this to click in the edit before you can send your text.
Fortunately, you can use the set position button to get the coords for you.

2. Now that you have the coords, you can write to click in the edit and then the text that you want to type into it
{Click, "the x for the edit" , " the y for the edit"}This is what I want to type in the edit{Enter}this is on a new line{enter 10}this is 10 lines below that.
or in other words you would type it like this
{click,220,345}This is what I want to type in the edit{Enter}this is on a new line{enter 10}this is 10 lines below that.

Just be sure not to press "Enter" while you are adding the text, I can't remember, but that might break it.Let the script deal with making new lines in the scripts command edit.


As for:
luciga wrote:
01 Feb 2019, 14:44
I have 2 bars, 1 is red, the other is blue (life/mana)
Is it possible to do both bars in the same Pixel predator?
This script can only deal with 1 color, but you can run more than 1 instance of the script by either saving it in two script files, or by editing
#SingleInstance,Force to #SingleInstance,Off at the top of the script.


As for:
luciga wrote:
01 Feb 2019, 14:44
If those bars are no longer red or blue, I need to press for example f1 to one and f2
How do I add keyboard button on it?
You can set the script to check for a false value.
So for example, if you are looking to see if a bar is no longer red.
1. You set the position to be as small as you can (the second half of the bar for example).

2. Then you set the color to be red, add a bit of variation.

3. select "FALSE".

4. Select "T" for text.

5. Add the text that you want to send when the color (red) is no longer found.
  • add a random click point on the games window (this is just to make sure that the game is active when you send the keystroke to it), it can be anywhere, it is just to activate the window if it's not already active.
    i.e. {Click,220,220}
  • Add the key you want to send i.e. F1
{Click,220,220}{F1}

The second half of the video deals with sending keystrokes (the "T" option) and false.
luciga
Posts: 30
Joined: 01 Dec 2016, 08:52

Re: Pixel Predator - Pixel Search Script

18 Feb 2019, 09:15

Hellbent wrote:
15 Feb 2019, 14:09
luciga wrote:
01 Feb 2019, 14:44
Aaah.. How can I use the *10 command (send)?
For the most part you use it the same way you would use "Sendinput," in a script

So if you want to send F1 you would type {F1}
if you want to type in a edit, you would do something like this.

1. Before you run the script, get the coords for the edit, you will need this to click in the edit before you can send your text.
Fortunately, you can use the set position button to get the coords for you.

2. Now that you have the coords, you can write to click in the edit and then the text that you want to type into it
{Click, "the x for the edit" , " the y for the edit"}This is what I want to type in the edit{Enter}this is on a new line{enter 10}this is 10 lines below that.
or in other words you would type it like this
{click,220,345}This is what I want to type in the edit{Enter}this is on a new line{enter 10}this is 10 lines below that.

Just be sure not to press "Enter" while you are adding the text, I can't remember, but that might break it.Let the script deal with making new lines in the scripts command edit.


As for:
luciga wrote:
01 Feb 2019, 14:44
I have 2 bars, 1 is red, the other is blue (life/mana)
Is it possible to do both bars in the same Pixel predator?
This script can only deal with 1 color, but you can run more than 1 instance of the script by either saving it in two script files, or by editing
#SingleInstance,Force to #SingleInstance,Off at the top of the script.


As for:
luciga wrote:
01 Feb 2019, 14:44
If those bars are no longer red or blue, I need to press for example f1 to one and f2
How do I add keyboard button on it?
You can set the script to check for a false value.
So for example, if you are looking to see if a bar is no longer red.
1. You set the position to be as small as you can (the second half of the bar for example).

2. Then you set the color to be red, add a bit of variation.

3. select "FALSE".

4. Select "T" for text.

5. Add the text that you want to send when the color (red) is no longer found.
  • add a random click point on the games window (this is just to make sure that the game is active when you send the keystroke to it), it can be anywhere, it is just to activate the window if it's not already active.
    i.e. {Click,220,220}
  • Add the key you want to send i.e. F1
{Click,220,220}{F1}

The second half of the video deals with sending keystrokes (the "T" option) and false.
Thank you very much <3
SilentThunder
Posts: 4
Joined: 30 Jan 2019, 10:49

Re: Pixel Predator - Pixel Search Script

22 Mar 2019, 11:21

hi again

I am hoping u can help me change the script so that it will search from bottom to top rather than top to bottom. I remember watching ur tutorial #4: PixelSearch (1) and u had said u thought that script would go backwards but u had not tried it. im hoping same thing can be applied to the pixel predator. but i have no clue what to change. if its not a big issue could u help me out? ty

i use this everyday, its amazing. im still learning and watching ur videos
nou
Posts: 14
Joined: 24 Feb 2019, 21:21

Re: Pixel Predator - Pixel Search Script

22 Mar 2019, 11:53

I'm not sure about bottom to top, but there is the "slow mode" feature:
Slow mode only: By default, the search starts at the upper-left pixel of the region and checks all pixels vertically beneath it for a match. If no match is found there, the search continues to the right, column by column, until it finds a matching pixel. The default left-to-right search order can be inverted by swapping X1 and X2 in the parameter list. In other words, if X1 is greater than X2, the search will be conducted from right to left, starting at column X1. Similarly, if Y1 is greater than Y2, each column
of pixels to be searched starting at the bottom rather than the top. Finally, if the region to be searched is large and the search is repeated with high frequency, it may consume a lot of CPU time. To alleviate this, keep the size of the area to a minimum.
SilentThunder
Posts: 4
Joined: 30 Jan 2019, 10:49

Re: Pixel Predator - Pixel Search Script

22 Mar 2019, 12:01

yes he talked about that in his video, I really need it to start at bottom and go to top. I currently use 2 instances of this and if I can get it to go from bottom to top I can use 4 instances and be very efficient
DRocks
Posts: 400
Joined: 08 May 2018, 10:20

Re: Pixel Predator - Pixel Search Script

22 Mar 2019, 21:25

4 instances ?
What are you trying to do?

Return to “Scripts and Functions”

Who is online

Users browsing this forum: No registered users and 106 guests