toggle WLAN in FRITZ!Box 7530

Post your working scripts, libraries and tools for AHK v1.1 and older
User avatar
SL5
Posts: 879
Joined: 12 May 2015, 02:10
Contact:

toggle WLAN in FRITZ!Box 7530

09 Apr 2019, 06:56

toggle WLAN in FRITZ!Box 7530

Please let me know if this works for you and if you have another better solution.
thanks to https://www.autohotkey.com/boards/viewtopic.php?f=6&t=17834

thanks

Code: Select all


#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
#SingleInstance,Force
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.
Process, Priority,, H ; <=== only use this if its not in a critical development 05.11.2018 13:20
#MaxHotkeysPerInterval 99000000
#HotkeyInterval 99000000
SetKeyDelay, -1, -1
SetWinDelay, -1 ; Sets the delay that will occur after each windowing command, such as WinActivate.
SetControlDelay, -1 ; A short delay (sleep) is done automatically after every Control command that changes a control, namely Control, ControlMove, ControlClick, ControlFocus, and ControlSetText (ControlSend uses SetKeyDelay).

CoordMode, Caret,Screen
CoordMode, Mouse,Screen
CoordMode, Pixel,Screen
CoordMode, Menu,Screen
CoordMode, Tooltip,Screen
SetTitleMatchMode,2

clickWLAN(){
	needle=FRITZ!Box 7530 - Mozilla Firefox ahk_class MozillaWindowClass ; mouseWindowTitle=0x30244a  ; 
	
	Text:="|<>**50$58.000000000000000000000ss0000000M0A00000023s4000000V04800C710E04E00sQ40000003VsE00000065XA1z0M00MyA0E10001nMk0710007Bn0X0W000AnA2010000nAkC03U003Mr0000000BX803Q0000q4U0U80001sG04QE00051s0E40000Q7U00800000000000000000000000008"	
	WinGetPos, wX, wY, wW, wH, % needle
	xxx:=floor(wX/1.88)
	yyy:=floor(wY/1.88)
	if(ok:=FindText(xxx,yyy,xxx+wW,yyy+wH, 0, 0, Text)){
		X:=ok.1.1, Y:=ok.1.2, W:=ok.1.3, H:=ok.1.4, Comment:=ok.1.5, X+=W//2, Y+=H//2
		;MouseMove,% X+50,% Y
		MouseClick,left,% X+50,% Y
		sleep,1500
		MouseClick,left,1, 55,,,,R
		sleep,1500
		MouseClick,left,401, 1,,,,R
		sleep,35
		send, {WheelDown 10}
		send, {WheelUp 2}
		Sleep,1500
		
		; Text:="|<>*174$71.000000000000zzw00000000100800000000200E00000000400U1Ukn01UM80901XVa070sE0u0373A0D1kU3Y06D6M0K3l0C80AK8k1Y6mksE0NglU3ABYnUU0P9X04MNcy100qP60TknEs201coA0zlWU0403lcM31X500807Vkk616200E073VzA3A7zzU0A73zk6M000000000000U"
		Text:="|<>*180$16.zzy00M01U0600M0NU3a0QN3VaQ6DUMQ1U0600M01zzy" ; checked checkbox
		Text:="|<>*175$16.zzy00M01U0600M01U0600M01U0600M01U0600M01zzy" ; UnChecked checkbox
		TextWlanText:="|<>*180$68.U000000000080000000000200000000000U1Ukn01UM6080AQAk0w71U20373A0D1kM0U0lsn02kS6080AK8k1a6lU203BaA0NVgM0U0P9X04MNa0806nMk3z6Nbm01cqA0zlXNwU0SD30MAMy0807Vkk61a7U200sQDtUNUs0U0A73zs6MC08"
		
		Y2 := yyy
		while(A_Index<=2 && ok:=FindText(xxx+100,Y2+50,xxx+wW-100,yyy+wH, 0, 0, TextWlanText)){
			X2:=ok.1.1, Y2:=ok.1.2, W:=ok.1.3, H:=ok.1.4, Comment:=ok.1.5, X+=W//2, Y+=H//2
			;MouseMove,% X2-11,% Y2+5
			MouseClick,left,% X2-11,% Y2+5 ; works with TextWlanText
			; MouseClick,left,% X2+5,% Y2+5 ; works with checkboxes 
		}
		sleep,3500		
		
		if(0){
			Text:="|<>[email protected]$68.Dzzzzzzzzzznzzzzzzzzzzwzzzz8zzzzzzDzzzUDzzzzznzzzs3lzzzzwzzzsyATzzzzDzzyDX7zzzznzzzXslzzzzwzzzsyATzzzzDzzyDX070M03zzzXsk0U200zzzsyAA8MVkDzzyDX7WC8QHzzzXslsU2D4zzzsSAS80XlDzzy7X7WDswHzzzlklkVyD4zzzw0A0M0XlDzzzU70708wHzzzy7z7wDzwzzzzzzzzzzzDzzzzzzzzzznzzzzzzzzzzwzzzzzzzzzzzDzzzzzzzzzzs"
			if(ok:=FindText(xxx,yyy,xxx+wW,yyy+wH, 0, 0, Text)){
				X3:=ok.1.1, Y3:=ok.1.2, W:=ok.1.3, H:=ok.1.4, Comment:=ok.1.5, X+=W//2, Y+=H//2
			; MouseMove,% X3+50,% Y3 ; click übernehmen
				MouseClick,left,% X3+50,% Y3 
			}
		}
		; close it again
		sleep,3500		
		MouseClick,left,% X+50,% Y
		;msgbox,found
	}else{
		Clipboard = found nothing  in %wX%`, %wY%`, %wW%`, %wH% (19-04-09_01-29)
		msgbox, % Clipboard
	}
	return
}




t1:=A_TickCount
Text:="|<>*117$47.zzzzzzzzzwzzzzzy09zzzsyQ0Tzzzlwz7zzzzXtyDAV3z7mwSM03yDZswlXbwTDltbbDsyTXnDCEFwz7aSQkXtyDAwtzbbwSNtnz0Dswnnbz0zzzzzzzzw"
needle=Telegram TOP ahk_class Qt5QWindowIcon ; mouseWindowTitle=0x220f48  ; 
WinGetPos, wX, wY, wW, wH, % needle
xxx:=floor(wX/1.88)
yyy:=floor(wY/1.88)
if(ok:=FindText(xxx,yyy,xxx+wW,yyy+wH, 0, 0, Text)){
	X:=ok.1.1, Y:=ok.1.2, W:=ok.1.3, H:=ok.1.4, Comment:=ok.1.5, X+=W//2, Y+=H//2
	MouseMove,% X+50,% Y
	msgbox,found
}else{
	Clipboard = found nothing  in %wX%`, %wY%`, %wW%`, %wH% (19-04-09_01-29)
	msgbox, % Clipboard
}
Reload

;===== Copy The Following Functions To Your Own Code Just once =====


; FindText() used to find images restored by Base64 text on screen.
; X is the search scope's upper left corner X coordinates
; Y is the search scope's upper left corner Y coordinates
; W is the search scope's Width
; H is the search scope's Height.
; err1 is the character "0" fault-tolerant in percentage.
; err0 is the character "_" fault-tolerant in percentage.
; Text can be a lot of text to find, separated by "|".
; ScreenShot if the value is 0, the last screenshot will be used.
; ruturn a second-order array contains the [X,Y,W,H,Comment] of Each Find.

FindText(x, y, w, h, err1, err0, text, ScreenShot=1)
{
	xywh2xywh(x,y,w,h,x,y,w,h)
	if (w<1 or h<1)
		return, 0
	bch:=A_BatchLines
	SetBatchLines, -1
  ;--------------------------------------
	GetBitsFromScreen(x,y,w,h,Scan0,Stride,ScreenShot,zx,zy)
  ;--------------------------------------
	sx:=x-zx, sy:=y-zy, sw:=w, sh:=h, arr:=[]
	Loop, 2 {
		Loop, Parse, text, |
		{
			v:=A_LoopField
			IfNotInString, v, $, Continue
				comment:="", e1:=err1, e0:=err0
    ; You Can Add Comment Text within The <>
			if RegExMatch(v,"<([^>]*)>",r)
				v:=StrReplace(v,r), comment:=Trim(r1)
    ; You can Add two fault-tolerant in the [], separated by commas
			if RegExMatch(v,"\[([^\]]*)]",r)
			{
				v:=StrReplace(v,r), r1.=","
				StringSplit, r, r1, `,
				e1:=r1, e0:=r2
			}
			StringSplit, r, v, $
			color:=r1, v:=r2
			StringSplit, r, v, .
			w1:=r1, v:=base64tobit(r2), h1:=StrLen(v)//w1
			if (r0<2 or h1<1 or w1>sw or h1>sh or StrLen(v)!=w1*h1)
				Continue
    ;--------------------------------------
			mode:=InStr(color,"#") ? 3 : InStr(color,"**") ? 2
			: InStr(color,"*") ? 1 : 0
			color:=RegExReplace(color,"[*#]") . "@"
			StringSplit, r, color, @
			color:=mode=3 ? ((r1-1)//w1)*Stride+Mod(r1-1,w1)*4 : r1
			n:=Round(r2,2)+(!r2), n:=Floor(255*3*(1-n))
			StrReplace(v,"1","",len1), len0:=StrLen(v)-len1
			e1:=Round(len1*e1), e0:=Round(len0*e0), k:=StrLen(v)*4
			VarSetCapacity(gs, sw*sh), VarSetCapacity(ss, sw*sh, 0)
			VarSetCapacity(s1, k), VarSetCapacity(s0, k)
			VarSetCapacity(allpos, 1024*4)
    ;--------------------------------------
			if (ok:=PicFind(mode,color,n,Scan0,Stride
				,sx,sy,sw,sh,gs,ss,v,s1,s0,e1,e0,w1,h1,allpos))
			{
				Loop, % ok
					pos:=NumGet(allpos, 4*(A_Index-1), "uint")
				, rx:=(pos&0xFFFF)+zx, ry:=(pos>>16)+zy
				, arr.Push( [rx,ry,w1,h1,comment] )
			}
		}
		if (err1=0 && err0=0 && !arr.MaxIndex())
			err1:=err0:=0.1
		else Break
	}
	SetBatchLines, %bch%
	return, arr.MaxIndex() ? arr:0
}

PicFind(mode, color, n, Scan0, Stride, sx, sy, sw, sh
, ByRef gs, ByRef ss, ByRef text, ByRef s1, ByRef s0
, err1, err0, w1, h1, ByRef allpos)
{
	static MyFunc, Ptr:=A_PtrSize ? "UPtr" : "UInt"
	if !MyFunc
	{
		x32:="5557565383EC3C8B9C24940000008B7C245085DB0F8E690"
		. "8000031C0897C2450C744240C00000000C744240800000000C"
		. "74424040000000031EDC74424100000000089C78B4C24088BB"
		. "424900000008B5C24108B54240C01CE89C829CB8B8C2490000"
		. "000035C247C85C97E5889342489F989D6EB188BBC248400000"
		. "083C60483C0018914AF83C501390424742A837C24500389F20"
		. "F45D0803C033175D88BBC248000000083C60483C0013904248"
		. "9148F8D790189F975D68B9C2490000000015C241089CF83442"
		. "404018B74246C8B442404017424088B7424600174240C39842"
		. "4940000000F855AFFFFFF89F8897C24108B7C245039E80F4CC"
		. "589042483FF030F84810400008B4424608B5C24640FAF44246"
		. "88D14988B44246C8B5C2460F7D885FF8D0483894424180F847"
		. "301000083FF010F84960600008B44246CC744240400000000C"
		. "744240800000000C1E0028944240C8B44247085C07E73896C2"
		. "41489D58B7C246C85FF7E4E8B4C245C8B5C24088B7C245C035"
		. "C247401E9036C240C01EF0FB6510283C10483C3016BF2260FB"
		. "651FD6BC24B8D14060FB671FC89F0C1E00429F001D0C1F8078"
		. "843FF39F975D28B5C246C015C24088344240401036C24188B4"
		. "424043944247075978B6C2414837C2470020F8EAA0100008B4"
		. "424740344246C896C24208B6C2454C74424040100000089442"
		. "40C8B4424780344246C894424148B44247083E801894424188"
		. "B44246C83E8028944241C8B44246CF7D889442408837C246C0"
		. "27E568B7C241C8B44240C8B4C241401C70FB650010FB630BB0"
		. "100000001EA39F27C290FB6700239F27C218B7424080FB6743"
		. "00139F27C148B5C246C0FB65C180139DA0F9CC38DB60000000"
		. "083C00188590183C10139F875B883442404018B74246C8B442"
		. "4040174240C017424143944241875888B6C2420E9E10000008"
		. "B442454C744241400000000C744241C00000000C1E8100FB6C"
		. "0894424048B4424540FB6C4894424080FB64424548944240C8"
		. "B44246CC1E002894424248B44247085C00F8E98000000896C2"
		. "42866908B44246C85C07E6F8B5C245C8B74241C8B6C245C037"
		. "4247801D3035424248954242001D50FB64B020FB653012B4C2"
		. "4042B5424080FB6032B44240C89CFC1FF1F31F929F989D7C1F"
		. "F1F31FA29FA89C7C1FF1F01D131F829F801C8394424580F9D0"
		. "683C30483C60139DD75B98B5C246C015C241C8B54242083442"
		. "41401035424188B442414394424700F8572FFFFFF8B6C24288"
		. "B44246C2B842490000000894424188B4424702B84249400000"
		. "0894424300F88F30400008B44246889EF8B5424108BAC24800"
		. "00000C744241C00000000C744242C00000000C744242000000"
		. "000894424288B44241885C00F88BB0000008B442428C744240"
		. "400000000C1E010894424248B442464894424148DB60000000"
		. "08B4424040344241C39BC248C00000089C3894424100F84B50"
		. "000008B84248C0000008B3424035C24788B8C2488000000894"
		. "4240C31C085F60F8407010000894C2408EB2839F87D188B8C2"
		. "4840000008B348101DE803E007407836C240C01782283C0013"
		. "B04240F84D900000039D07DD48B74850001DE803E0174C9836"
		. "C24080179C2834424040183442414018B442404394424180F8"
		. "D66FFFFFF8344242C018B74246C8B44242C0174241C8344242"
		. "801394424300F8D19FFFFFF8B54242083C43C89D05B5E5F5DC"
		. "24C008DB60000000085D20F84C30200008B5C24788B7424103"
		. "1C08B8C248800000001F38B74850001DE803E01740583E9017"
		. "88783C00139D075E98B7424208B8C249800000089F083C0018"
		. "94424208B4424140B442424817C2420FF0300008904B17F8F3"
		. "1C08D76008B4C850083C00101D939D0C601007CF0E93DFFFFF"
		. "F8B5C24208BB4249800000089D883C00189C1894424208B442"
		. "4140B44242481F9FF03000089049E0F8F48FFFFFF85D20F840"
		. "8FFFFFF8B4424788B5C241001C3EBA58B44246C034424642B8"
		. "42490000000894424288B442468034424702B8424940000003"
		. "9442468894424380F8FE30200008B4424608B5C24640FAF442"
		. "4688B74245CC744242C00000000896C24148D0498034424548"
		. "94424348B442428394424640F8F580100008B442468C1E0108"
		. "94424308B442434894424248B4424648944241889F68DBC270"
		. "00000008B4424240FB65C060289C72B7C2454895C24040FB65"
		. "C06010FB60406895C24088944240C8B042485C00F843101000"
		. "08B84248C00000031DB894424208B8424880000008944241CE"
		. "B738DB426000000003B5C24147D5A8B8424840000008B14980"
		. "1FA0FB64C16020FB64416012B4C24042B4424080FB614162B5"
		. "4240C89CDC1FD1F31E929E989C5C1FD1F31E829E889D5C1FD1"
		. "F01C131EA29EA01CA395424587C0F836C2420017874908DB42"
		. "60000000083C3013B1C240F84A40000003B5C24107D8E8B8C2"
		. "4800000008B049901F80FB64C06020FB65406012B4C24042B5"
		. "424080FB604062B44240C89CDC1FD1F31E929E989D5C1FD1F3"
		. "1EA29EA89C5C1FD1F01D131E829E801C83B4424580F8E3FFFF"
		. "FFF836C241C010F8934FFFFFF834424180183442424048B442"
		. "418394424280F8DCCFEFFFF83442468018B5C24608B4424380"
		. "15C24343B4424680F8D7FFEFFFF8B54242CE956FDFFFF908DB"
		. "426000000008B5C242C8B4424300B4424188BBC24980000008"
		. "D530181FAFF03000089049F0F8F29FDFFFF8954242CEB918B5"
		. "C24208BB4249800000089D883C00189C1894424208B4424140"
		. "B44242481F9FF03000089049E0F8EBAFCFFFFE9EDFCFFFF8B4"
		. "42454C744240400000000C74424080000000083C001C1E0078"
		. "9C38B44246CC1E002894424148B44247085C00F8E82FBFFFF8"
		. "96C241C89DD8B44246C85C07E598B4C245C8B5C2408035C247"
		. "801D10354241489D7037C245C8954240C8DB6000000000FB65"
		. "1020FB641010FB6316BC04B6BD22601C289F0C1E00429F001D"
		. "039C50F970383C10483C30139F975D58B5C246C015C24088B5"
		. "4240C8344240401035424188B44240439442470758C8B6C241"
		. "CE9FFFAFFFFC704240000000031EDC744241000000000E963F"
		. "8FFFF31D2E91EFCFFFF"
		x64:="4157415641554154555756534883EC38448B94240801000"
		. "0448BA424B80000008954241044898424900000004C89CD4C8"
		. "BAC24E80000004585D20F8E610900004489A424B8000000488"
		. "BAC24E000000031FF448BA4240001000031DB31F64531FF453"
		. "1F6C7442404000000004C898C24980000004585E47E6448635"
		. "42404458D1C1C89D848039424D80000004189F8EB1C83C0014"
		. "D63D74183C0044183C7014883C2014139C347894C9500742B8"
		. "3F9034589C1440F45C8803A3175D583C0014D63D64183C0044"
		. "183C6014883C2014139C346894C950075D5440164240483C60"
		. "1039C24B800000003BC24A000000039B424080100000F8579F"
		. "FFFFF4539FE4489F8488BAC2498000000448BA424B80000004"
		. "10F4DC68944242483F9030F84130500008B8424A00000008BB"
		. "424A80000000FAF8424B00000008D04B08BB424A000000089C"
		. "24489E0F7D885C98D0486894424040F84B401000083F9010F8"
		. "47F070000448B8424C00000004531DB31DB428D34A50000000"
		. "04585C00F8EAA000000448974240844897C240C89D74C89AC2"
		. "4E8000000448B742404448BBC24C00000004C8BAC24C800000"
		. "00F1F8400000000004585E47E564863C74C63D34531C0488D4"
		. "C05024D01EA662E0F1F8400000000000FB6114883C104446BC"
		. "A260FB651FB6BC24B418D1401440FB649FA4489C8C1E004442"
		. "9C801D0C1F807438804024983C0014539C47FCA01F74401E34"
		. "183C3014401F74539DF7599448B742408448B7C240C4C8BAC2"
		. "4E800000083BC24C0000000020F8EDC010000488B8424C8000"
		. "0004963EC458D5C24FD4989EA4C039424D00000008B7424104"
		. "4897C2408BF010000004983C301488D58018B8424C00000004"
		. "4897424044C89AC24E800000083E8014189C74183FC024C8D2"
		. "C2B7E5B4E8D742D004C89EA31C9662E0F1F8400000000000FB"
		. "602440FB64AFF41B80100000001F04439C87C20440FB64A014"
		. "439C87C16440FB60C0B4439C87C0C450FB6040E4439C0410F9"
		. "CC04588440A014883C1014883C2014939CB75B983C7014901E"
		. "A4C89EB4139FF758D448B742404448B7C24084C8BAC24E8000"
		. "000E9070100008B742410448B8C24C00000004531DB4889F08"
		. "9F3400FB6F60FB6FC428D04A500000000C1EB104585C90FB6D"
		. "B894424080F8ED10000004889AC24980000008BAC249000000"
		. "0448974240C44897C24104189CE4C89AC24E80000004589DF4"
		. "189D50F1F40004585E47E75488B8C24980000004D63DF4C039"
		. "C24D00000004963C54531C94C8D440102410FB608410FB650F"
		. "F410FB640FE29D929FA4189CA29F041C1FA1F4431D14429D14"
		. "189D241C1FA1F4431D24429D201CA89C1C1F91F31C829C801D"
		. "039C5430F9D040B4983C1014983C0044539CC7FB144036C240"
		. "84501E74183C60144036C24044439B424C00000000F856FFFF"
		. "FFF448B74240C448B7C24104C8BAC24E80000004489E58B842"
		. "4C00000002BAC24000100002B842408010000894424280F887"
		. "F050000488BB424E0000000418D46FF31FF8B9C24B00000008"
		. "97C2408448B5C24244C8B8C24D0000000488D4486048BBC24F"
		. "8000000896C2404C744242000000000C744240C00000000488"
		. "9F54889442410895C241C4489A424B80000008B44240485C00"
		. "F88A10000008B44241C448BA424A800000031DBC1E01089442"
		. "4188B4424084439FF448D04030F84B300000031C04585DB89F"
		. "E448B9424F0000000753BE929010000660F1F8400000000004"
		. "439F97D1B418B5485004401C24863D241803C1100740983EE0"
		. "1782F0F1F40004883C0014139C30F8EF30000004439F089C17"
		. "DCC8B5485004401C24863D241803C110174BB4183EA0179B58"
		. "3C3014183C401395C24040F8D74FFFFFF83442420018B9C24B"
		. "80000008B442420015C24088344241C01394424280F8D30FFF"
		. "FFF8B44240C4883C4385B5E5F5D415C415D415E415FC34585F"
		. "60F84330300008B8C24F00000004C8B5424104889EA8B02440"
		. "1C0489841803C0101740583E901788C4883C2044C39D275E44"
		. "86354240C8B4C2418488BB424100100004409E189D0890C968"
		. "3C0013DFF0300007F988944240C31C08B5485004883C001440"
		. "1C24139C64863D241C60411007FE883C3014183C401395C240"
		. "40F8DB6FEFFFFE93DFFFFFF90486354240C8B4C2418488BB42"
		. "4100100004409E189D0890C9683C0013DFF0300000F8F3CFFF"
		. "FFF4585F68944240C759FE9F6FEFFFF8B8424B000000003842"
		. "4C00000004403A424A80000002B842408010000442BA424000"
		. "10000398424B00000008944242C44896424180F8F440300008"
		. "B8424A00000008BBC24A80000000FAF8424B0000000448B642"
		. "424C744241C000000004C89AC24E80000008D04B8034424108"
		. "94424284489F84589F74189C68B442418398424A80000000F8"
		. "F950100008B8424B0000000448B6C2428C1E010894424208B8"
		. "424A8000000894424046690418D45024489EF2B7C24104585E"
		. "44898440FB65C0500418D450148980FB65C05004963C50FB67"
		. "405000F84730100008B8424F80000004531C08944240C8B842"
		. "4F000000089442408E9900000000F1F004539CE7E7B488B8C2"
		. "4E8000000428B048101F88D50024863D20FB64C15008D50014"
		. "8980FB64405004863D20FB65415004429D94189C929F041C1F"
		. "91F29DA4431C94429C94189D141C1F91F4431CA4429CA4189C"
		. "141C1F91F01D14431C84429C801C8398424900000007C15836"
		. "C240C010F8898000000662E0F1F8400000000004983C001453"
		. "9C40F8EC50000004539C74589C10F8E67FFFFFF488B8C24E00"
		. "00000428B048101F88D50024863D20FB64C15008D500148980"
		. "FB64405004863D20FB65415004429D94189CA29F041C1FA1F2"
		. "9DA4431D14429D14189D241C1FA1F4431D24429D24189C241C"
		. "1FA1F01D14431D04429D001C83B8424900000000F8EFDFEFFF"
		. "F836C2408010F89F2FEFFFF83442404014183C5048B4424043"
		. "94424180F8D8BFEFFFF838424B0000000018BBC24A00000008"
		. "B44242C017C24283B8424B00000000F8D36FEFFFF8B44241CE"
		. "9E1FCFFFF486354241C8B4C24200B4C2404488BB4241001000"
		. "089D083C001890C963DFF0300000F8FB9FCFFFF8944241CEB8"
		. "E486354240C8B4C2418488BB424100100004409E189D0890C9"
		. "683C0013DFF0300000F8F8CFCFFFF8944240CE94BFCFFFF448"
		. "B5C24108B8C24C000000031DB31F6428D3CA5000000004183C"
		. "30141C1E30785C90F8E0BFBFFFF44897C240C4C89AC24E8000"
		. "000448BBC24C0000000448B6C240444897424084189D64585E"
		. "47E504C63D64C039424D00000004963C6488D4C05024531C00"
		. "FB6110FB641FF440FB649FE6BC04B6BD22601C24489C8C1E00"
		. "44429C801D04139C3430F9704024983C0014883C1044539C47"
		. "FCC4101FE4401E683C3014501EE4139DF75A0448B742408448"
		. "B7C240C4C8BAC24E8000000E972FAFFFFC7442424000000004"
		. "531FF4531F6E965F7FFFF31C0E9A8FBFFFF9090909090"
		MCode(MyFunc, A_PtrSize=8 ? x64:x32)
	}
	return, DllCall(&MyFunc
	, "int",mode, "uint",color, "int",n, Ptr,Scan0
	, "int",Stride, "int",sx, "int",sy, "int",sw, "int",sh
	, Ptr,&gs, Ptr,&ss, "AStr",text, Ptr,&s1, Ptr,&s0
	, "int",err1, "int",err0, "int",w1, "int",h1, Ptr,&allpos)
}

xywh2xywh(x1,y1,w1,h1,ByRef x,ByRef y,ByRef w,ByRef h)
{
	SysGet, zx, 76
	SysGet, zy, 77
	SysGet, zw, 78
	SysGet, zh, 79
	left:=x1, right:=x1+w1-1, up:=y1, down:=y1+h1-1
	left:=left<zx ? zx:left, right:=right>zx+zw-1 ? zx+zw-1:right
	up:=up<zy ? zy:up, down:=down>zy+zh-1 ? zy+zh-1:down
	x:=left, y:=up, w:=right-left+1, h:=down-up+1
}

GetBitsFromScreen(x, y, w, h, ByRef Scan0, ByRef Stride
, ScreenShot=1, ByRef zx="", ByRef zy="")
{
	static bits, bpp, oldx, oldy, oldw, oldh
	if (ScreenShot or x<oldx or y<oldy
		or x+w>oldx+oldw or y+h>oldy+oldh)
	{
		oldx:=x, oldy:=y, oldw:=w, oldh:=h, ScreenShot:=1
		VarSetCapacity(bits, w*h*4), bpp:=32
	}
	Scan0:=&bits, Stride:=((oldw*bpp+31)//32)*4, zx:=oldx, zy:=oldy
	if (!ScreenShot or w<1 or h<1)
		return
	Ptr:=A_PtrSize ? "UPtr" : "UInt", PtrP:=Ptr . "*"
	win:=DllCall("GetDesktopWindow", Ptr)
	hDC:=DllCall("GetWindowDC", Ptr,win, Ptr)
	mDC:=DllCall("CreateCompatibleDC", Ptr,hDC, Ptr)
  ;-------------------------
	VarSetCapacity(bi, 40, 0), NumPut(40, bi, 0, "int")
	NumPut(w, bi, 4, "int"), NumPut(-h, bi, 8, "int")
	NumPut(1, bi, 12, "short"), NumPut(bpp, bi, 14, "short")
  ;-------------------------
	if hBM:=DllCall("CreateDIBSection", Ptr,mDC, Ptr,&bi
		, "int",0, PtrP,ppvBits, Ptr,0, "int",0, Ptr)
	{
		oBM:=DllCall("SelectObject", Ptr,mDC, Ptr,hBM, Ptr)
		DllCall("BitBlt", Ptr,mDC, "int",0, "int",0, "int",w, "int",h
		, Ptr,hDC, "int",x, "int",y, "uint",0x00CC0020|0x40000000)
		DllCall("RtlMoveMemory", Ptr,Scan0, Ptr,ppvBits, Ptr,Stride*h)
		DllCall("SelectObject", Ptr,mDC, Ptr,oBM)
		DllCall("DeleteObject", Ptr,hBM)
	}
	DllCall("DeleteDC", Ptr,mDC)
	DllCall("ReleaseDC", Ptr,win, Ptr,hDC)
}

MCode(ByRef code, hex)
{
	bch:=A_BatchLines
	SetBatchLines, -1
	VarSetCapacity(code, len:=StrLen(hex)//2)
	Loop, % len
		NumPut("0x" SubStr(hex,2*A_Index-1,2),code,A_Index-1,"uchar")
	Ptr:=A_PtrSize ? "UPtr" : "UInt", PtrP:=Ptr . "*"
	DllCall("VirtualProtect",Ptr,&code, Ptr,len,"uint",0x40,PtrP,0)
	SetBatchLines, %bch%
}

base64tobit(s)
{
	Chars:="0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZ"
	. "abcdefghijklmnopqrstuvwxyz"
	SetFormat, IntegerFast, d
	StringCaseSense, On
	lls:=A_ListLines=0 ? "Off" : "On"
	ListLines, Off
	Loop, Parse, Chars
	{
		i:=A_Index-1, v:=(i>>5&1) . (i>>4&1)
		. (i>>3&1) . (i>>2&1) . (i>>1&1) . (i&1)
		s:=StrReplace(s,A_LoopField,v)
	}
	ListLines, %lls%
	StringCaseSense, Off
	s:=SubStr(s,1,InStr(s,"1",0,0)-1)
	s:=RegExReplace(s,"[^01]+")
	return, s
}

bit2base64(s)
{
	s:=RegExReplace(s,"[^01]+")
	s.=SubStr("100000",1,6-Mod(StrLen(s),6))
	s:=RegExReplace(s,".{6}","|$0")
	Chars:="0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZ"
	. "abcdefghijklmnopqrstuvwxyz"
	SetFormat, IntegerFast, d
	lls:=A_ListLines=0 ? "Off" : "On"
	ListLines, Off
	Loop, Parse, Chars
	{
		i:=A_Index-1, v:="|" . (i>>5&1) . (i>>4&1)
		. (i>>3&1) . (i>>2&1) . (i>>1&1) . (i&1)
		s:=StrReplace(s,v,A_LoopField)
	}
	ListLines, %lls%
	return, s
}

ASCII(s)
{
	if RegExMatch(s,"\$(\d+)\.([\w+/]+)",r)
	{
		s:=RegExReplace(base64tobit(r2),".{" r1 "}","$0`n")
		s:=StrReplace(StrReplace(s,"0","_"),"1","0")
	}
	else s=
		return, s
}

; You can put the text library at the beginning of the script,
; and Use Pic(Text,1) to add the text library to Pic()'s Lib,
; Use Pic("comment1|comment2|...") to get text images from Lib

Pic(comments, add_to_Lib=0)
{
	static Lib:=[]
	if (add_to_Lib)
	{
		re:="<([^>]*)>[^$]+\$\d+\.[\w+/]+"
		Loop, Parse, comments, |
			if RegExMatch(A_LoopField,re,r)
				Lib[Trim(r1)]:=r
		Lib[""]:=""
	}
	else
	{
		Text:=""
		Loop, Parse, comments, |
			Text.="|" . Lib[Trim(A_LoopField)]
		return, Text
	}
}

PicN(Number)
{
	return, Pic( RegExReplace(Number, ".", "|$0") )
}

; Use PicX(Text) to automatically cut into multiple characters

PicX(Text)
{
	if !RegExMatch(Text,"\|([^$]+)\$(\d+)\.([\w+/]+)",r)
		return, Text
	w:=r2, v:=base64tobit(r3), Text:=""
	c:=StrLen(StrReplace(v,"0"))<=StrLen(v)//2 ? "1":"0"
	wz:=RegExReplace(v,".{" w "}","$0`n")
	SetFormat, IntegerFast, d
	While InStr(wz,c) {
		While !(wz~="m`n)^" c)
			wz:=RegExReplace(wz,"m`n)^.")
		i:=0
		While (wz~="m`n)^.{" i "}" c)
			i++
		v:=RegExReplace(wz,"m`n)^(.{" i "}).*","$1")
		wz:=RegExReplace(wz,"m`n)^.{" i "}")
		if v!=
			Text.="|" r1 "$" i "." bit2base64(v)
	}
	return, Text
}

; Screenshot and retained as the last screenshot.

ScreenShot()
{
	n:=150000
	xywh2xywh(-n,-n,2*n+1,2*n+1,x,y,w,h)
	GetBitsFromScreen(x,y,w,h,Scan0,Stride,1)
}

FindTextOCR(nX, nY, nW, nH, err1, err0, Text, Interval=20)
{
	OCR:="", RightX:=nX+nW-1, ScreenShot()
	While (ok:=FindText(nX, nY, nW, nH, err1, err0, Text, 0))
	{
		For k,v in ok
		{
      ; X is the X coordinates of the upper left corner
      ; and W is the width of the image have been found
			x:=v.1, y:=v.2, w:=v.3, h:=v.4, comment:=v.5
      ; We need the leftmost X coordinates
			if (A_Index=1 or x<LeftX)
				LeftX:=x, LeftY:=y, LeftW:=w, LeftH:=h, LeftOCR:=comment
			else if (x=LeftX)
			{
				Loop, 100
				{
					err:=A_Index/100
					if FindText(x, y, w, h, err, err, Text, 0)
					{
						LeftX:=x, LeftY:=y, LeftW:=w, LeftH:=h, LeftOCR:=comment
						Break
					}
					if FindText(LeftX, LeftY, LeftW, LeftH, err, err, Text, 0)
						Break
				}
			}
		}
    ; If the interval exceeds the set value, add "*" to the result
		OCR.=(A_Index>1 && LeftX-nX-1>Interval ? "*":"") . LeftOCR
    ; Update nX and nW for next search
		nX:=LeftX+LeftW-1, nW:=RightX-nX+1
	}
	return, OCR
}

; Reordering the objects returned from left to right,
; from top to bottom, ignore slight height difference

SortOK(ok, dy=10) {
	if !IsObject(ok)
		return, ok
	SetFormat, IntegerFast, d
	For k,v in ok
	{
		x:=v.1+v.3//2, y:=v.2+v.4//2
		y:=A_Index>1 && Abs(y-lasty)<dy ? lasty : y, lasty:=y
		n:=(y*150000+x) "." k, s:=A_Index=1 ? n : s "-" n
	}
	Sort, s, N D-
	ok2:=[]
	Loop, Parse, s, -
		ok2.Push( ok[(StrSplit(A_LoopField,".")[2])] )
	return, ok2
}

; Reordering according to the nearest distance

SortOK2(ok, px, py) {
	if !IsObject(ok)
		return, ok
	SetFormat, IntegerFast, d
	For k,v in ok
	{
		x:=v.1+v.3//2, y:=v.2+v.4//2
		n:=((x-px)**2+(y-py)**2) "." k
		s:=A_Index=1 ? n : s "-" n
	}
	Sort, s, N D-
	ok2:=[]
	Loop, Parse, s, -
		ok2.Push( ok[(StrSplit(A_LoopField,".")[2])] )
	return, ok2
}

; Prompt mouse position in remote assistance

MouseTip(x="", y="") {
	if (x="")
	{
		VarSetCapacity(pt,16,0), DllCall("GetCursorPos","ptr",&pt)
		x:=NumGet(pt,0,"uint"), y:=NumGet(pt,4,"uint")
	}
	x:=Round(x-10), y:=Round(y-10), w:=h:=2*10+1
  ;-------------------------
	Gui, _MouseTip_: +AlwaysOnTop -Caption +ToolWindow +Hwndmyid +E0x08000000
	Gui, _MouseTip_: Show, Hide w%w% h%h%
  ;-------------------------
	dhw:=A_DetectHiddenWindows
	DetectHiddenWindows, On
	d:=4, i:=w-d, j:=h-d
	s=0-0 %w%-0 %w%-%h% 0-%h% 0-0
	s=%s%  %d%-%d% %i%-%d% %i%-%j% %d%-%j% %d%-%d%
	WinSet, Region, %s%, ahk_id %myid%
	DetectHiddenWindows, %dhw%
  ;-------------------------
	Gui, _MouseTip_: Show, NA x%x% y%y%
	Loop, 4 {
		Gui, _MouseTip_: Color, % A_Index & 1 ? "Red" : "Blue"
		Sleep, 500
	}
	Gui, _MouseTip_: Destroy
}

; Note: This function is used for combination lookup,
; for example, a 0-9 text library has been set up,
; then any ID number can be found.
; Use Pic(Text,1) and PicN(number) when using.
; Use PicX(Text) to automatically cut into multiple characters.
; Color position mode is not supported.

FindText2(x, y, w, h, err1, err0, text, ScreenShot=1, Interval=20)
{
	xywh2xywh(x,y,w,h,x,y,w,h)
	if (w<1 or h<1)
		return, 0
	bch:=A_BatchLines
	SetBatchLines, -1
  ;--------------------------------------
	GetBitsFromScreen(x,y,w,h,Scan0,Stride,ScreenShot,zx,zy)
  ;--------------------------------------
	sx:=x-zx, sy:=y-zy, sw:=w, sh:=h, arr:=[]
	info:=[], allw:=-1, allv:=allcolor:=allcomment:=""
	if (err1=0 && err0=0)
		err1:=err0:=0.1
	Loop, Parse, text, |
	{
		v:=A_LoopField
		IfNotInString, v, $, Continue
			comment:="", e1:=err1, e0:=err0
    ; You Can Add Comment Text within The <>
		if RegExMatch(v,"<([^>]*)>",r)
			v:=StrReplace(v,r), comment:=Trim(r1)
    ; You can Add two fault-tolerant in the [], separated by commas
		if RegExMatch(v,"\[([^\]]*)]",r)
		{
			v:=StrReplace(v,r), r1.=","
			StringSplit, r, r1, `,
			e1:=r1, e0:=r2
		}
		StringSplit, r, v, $
		color:=r1, v:=r2
		IfInString, color, #, Continue
		StringSplit, r, v, .
		w1:=r1, v:=base64tobit(r2), h1:=StrLen(v)//w1
		if (r0<2 or h1<1 or w1>sw or h1>sh or StrLen(v)!=w1*h1)
			Continue
		if (allcolor="")
		{
			mode:=InStr(color,"**") ? 2 : InStr(color,"*") ? 1 : 0
			color:=StrReplace(color,"*") . "@"
			StringSplit, r, color, @
			allcolor:=r1, n:=Round(r2,2)+(!r2), n:=Floor(255*3*(1-n))
		}
		StrReplace(v,"1","",len1), len0:=StrLen(v)-len1
		e1:=Round(len1*e1), e0:=Round(len0*e0)
		info.Push(StrLen(allv),w1,h1,len1,len0,e1,e0)
		allv.=v, allw+=w1+1, allcomment.=comment
	}
	if (allv="")
	{
		SetBatchLines, %bch%
		return, 0
	}
	num:=info.MaxIndex(), VarSetCapacity(in,num*4,0)
	Loop, % num
		NumPut(info[A_Index], in, 4*(A_Index-1), "int")
	VarSetCapacity(gs, sw*sh)
	VarSetCapacity(ss, sw*sh, 0), k:=StrLen(allv)*4
	VarSetCapacity(s1, k), VarSetCapacity(s0, k)
	VarSetCapacity(allpos, 1024*4)
	offsetX:=Interval, offsetY:=5
  ;--------------------------------------
	if (ok:=PicFind2(mode,allcolor,n,Scan0,Stride,sx,sy,sw,sh
		,gs,ss,allv,s1,s0,in,num,offsetX,offsetY,allpos))
	{
		Loop, % ok
			pos:=NumGet(allpos, 4*(A_Index-1), "uint")
		, rx:=(pos&0xFFFF)+zx, ry:=(pos>>16)+zy
		, arr.Push( [rx,ry,allw,h1,allcomment] )
	}
	SetBatchLines, %bch%
	return, arr.MaxIndex() ? arr:0
}

PicFind2(mode, color, n, Scan0, Stride, sx, sy, sw, sh
, ByRef gs, ByRef ss, ByRef text, ByRef s1, ByRef s0
, ByRef in, num, offsetX, offsetY, ByRef allpos)
{
	static MyFunc, Ptr:=A_PtrSize ? "UPtr" : "UInt"
	if !MyFunc
	{
		x32:="5557565383EC7C8B8424CC000000C7442414000000008BB"
		. "C24C400000085C00F8EB90000008B9C24C80000008B4424148"
		. "9DA8B34838B5C83048B448208895C240485C0894424107E7F8"
		. "9F28974240831EDC7042400000000908DB426000000008B442"
		. "40485C07E4C8B4C24088D1C28896C240C89E829E9038C24BC0"
		. "00000EB0D89049783C00183C20139C3741B803C013175ED8BA"
		. "C24C00000008944B50083C00183C60139C375E58B5C2404015"
		. "C24088B6C240C8304240103AC24AC0000008B0424394424107"
		. "59883442414078B442414398424CC0000000F8F47FFFFFF8B8"
		. "424A80000008B9424A40000000FAF8424A00000008D2C908B8"
		. "424AC0000008B9424A0000000F7D88D0482894424148B84249"
		. "000000085C00F85340500008B842494000000C744240C00000"
		. "000C744241000000000C1E8100FB6C08904248B84249400000"
		. "00FB6C4894424040FB6842494000000894424088B8424AC000"
		. "000C1E0028944241C8B8424B000000085C00F8E9C0000008B8"
		. "424AC00000085C07E778B9C249C0000008B74241003B424B80"
		. "0000001EB036C241C896C241803AC249C0000000FB64B020FB"
		. "653012B0C242B5424040FB6032B44240889CFC1FF1F31F929F"
		. "989D7C1FF1F31FA29FA01D19931D029D001C83B84249800000"
		. "00F9E0683C30483C60139DD75BB8BB424AC000000017424108"
		. "B6C24188344240C01036C24148B44240C398424B00000000F8"
		. "564FFFFFF8B9424C80000008B8424C80000008BB424C800000"
		. "08B9C24C80000008B52148B40048B760C8B5B108954242C8B9"
		. "424C800000089742428895C24108B5218895424248B9424AC0"
		. "0000029C239DE0F4DDE8BB424C8000000895424208B9424B00"
		. "00000895C24082B56088954246C0F88340600008B9C24C0000"
		. "0008B54242883E801C744241C00000000C744246000000000C"
		. "744247400000000894424648D1C93895C24788B44242085C00"
		. "F88EA0000008B7424608B8424A8000000C7442404000000000"
		. "1F0C1E0108944247089F02BB424D400000089F2BE000000000"
		. "F49F28974245C0FAFB424AC000000897424588BB424D400000"
		. "001C6897424688D7426008B4424040344241C89C1894424188"
		. "B442424394424100F84B40000008B5C240889C6038C24B8000"
		. "00031C08B54242C85DB0F8ED10000008934248B5C24288B6C2"
		. "410EB2939C57E188BB424C40000008B3C8601CF803F0074078"
		. "32C240178289083C001394424080F849B00000039C37ED38BB"
		. "424C00000008B3C8601CF803F0174C283EA0179BD834424040"
		. "18B442404394424200F8D66FFFFFF83442460018BB424AC000"
		. "0008B4424600174241C3944246C0F8DECFEFFFF8B4C247483C"
		. "47C89C85B5E5F5DC24C00908DB426000000008B7C242885FF7"
		. "E308BB424B80000008B5C241831C08B54242C01F38BB424C00"
		. "000008B0C8601D9803901740583EA01788683C00139C775EA8"
		. "B4424640344240483BC24CC00000007894424300F8EA901000"
		. "08B8424C8000000C744244C0700000083C020894424348B442"
		. "4348B9424AC0000008B7424308B0029C2894424508B8424D00"
		. "0000001F039C20F4EC289C28944245439F20F8C1CFFFFFF8B5"
		. "424348B720C8B42148B6A08897424408B7210894424448B842"
		. "4B00000002B4204897424148B74246839C60F4EC68BB424C00"
		. "000008944240C8B42FC890424C1E00201C6038424C40000008"
		. "94424488B44245C8B7C2430037C24583944240C8904240F8C9"
		. "700000085ED7E258B9C24B80000008B54241431C001FB8B0C8"
		. "601D9803901740583EA01785D83C00139C575EA8B4C244085C"
		. "90F8E970000008B54244439D10F848B0000008B9C24B800000"
		. "0896C243831C0897C243C8B6C244801FB89CFEB0B83C00139F"
		. "A746939C77E658B4C850001D980390074EA83EA0179E58B6C2"
		. "4388B7C243C8304240103BC24AC0000008B04243944240C0F8"
		. "D69FFFFFF83442430018B442430394424540F8D3DFFFFFF834"
		. "42404018B442404394424200F8D6FFDFFFFE904FEFFFF8D760"
		. "08DBC27000000008B4424308B5C24508344244C07834424341"
		. "C8D4418FF894424308B44244C398424CC0000000F8F6DFEFFF"
		. "F8B5C24748B442404038424A40000008BB424D80000000B442"
		. "4708D4B0181F9FF03000089049E0F8FC5FDFFFF8B54242885D"
		. "27E268B7424188B9C24B80000008B8424C000000001F38B742"
		. "4788B1083C00401DA39F0C6020075F28344240401894C24748"
		. "B442404394424200F8DC4FCFFFFE959FDFFFF83BC249000000"
		. "0010F848F0100008B8424AC000000C7042400000000C744240"
		. "400000000C1E002894424088B8424B000000085C07E798BB42"
		. "4AC00000085F67E5A8B8C249C0000008B5C24048BBC249C000"
		. "000039C24B400000001E9036C240801EF0FB6510283C10483C"
		. "3016BF2260FB651FD6BC24B8D14060FB671FC89F0C1E00429F"
		. "001D0C1F8078843FF39F975D28B9424AC00000001542404830"
		. "42401036C24148B0424398424B0000000758783BC24B000000"
		. "0020F8E02FBFFFF8B8424B8000000038424AC0000008BAC24B"
		. "400000003AC24AC000000C7042401000000894424088B8424B"
		. "0000000896C240C8BAC249400000083E801894424108B8424A"
		. "C00000083E802894424148B8424AC000000F7D88944240483B"
		. "C24AC000000027E5A8B7C24148B44240C8B4C240801C70FB65"
		. "0010FB630BB0100000001EA39F27C2D0FB6700239F27C258B7"
		. "424040FB674300139F27C188BB424AC0000000FB65C300139D"
		. "A0F9CC38DB4260000000083C00188590183C10139F875B4830"
		. "424018B9424AC0000008B04240154240C01542408394424107"
		. "580E922FAFFFF8B842494000000C7042400000000C74424040"
		. "000000083C001C1E00789C38B8424AC000000C1E0028944240"
		. "88B8424B000000085C00F8EE7F9FFFF89E889DD8BBC24AC000"
		. "00085FF7E628B8C249C0000008B5C2404039C24B800000001C"
		. "1034424088944240C0384249C00000089C78D76000FB651020"
		. "FB641010FB6316BC04B6BD22601C289F0C1E00429F001D039C"
		. "50F970383C10483C30139F975D58B9C24AC000000015C24048"
		. "B44240C83042401034424148B342439B424B00000000F857BF"
		. "FFFFFE959F9FFFF83C47C31C95B89C85E5F5DC24C009090909"
		. "090909090909090"
		x64:="4157415641554154555756534881EC88000000448B94244"
		. "8010000488B842440010000898C24D00000008954241444898"
		. "424E00000004C898C24E80000004585D24C8BB424200100004"
		. "C8BAC24280100004C8BBC24300100004C8BA42438010000488"
		. "9442408C7442410000000000F8EA20000004C89B4242001000"
		. "0448BB42408010000488B4424088B6808448B108B700485ED7"
		. "E5C4489D14489D74531DB31DB85F67E434863D7468D0C1E448"
		. "9D84C01EAEB164C63C14883C20183C1014389048483C001413"
		. "9C1741C803A3175E54D63C24883C2014183C2014389048783C"
		. "0014139C175E401F783C3014501F339DD75AF8344241007488"
		. "34424081C8B442410398424480100000F8F76FFFFFF4C8BB42"
		. "4200100008B8424000100008B9C24F80000000FAF8424F0000"
		. "000448B8C24D00000008D2C988B8424080100008B9C24F0000"
		. "000F7D84585C98D0483894424100F85590500008B742414448"
		. "B84241001000031D24531ED4889F089F3400FB6F60FB6FC8B8"
		. "42408010000C1EB100FB6DBC1E0024585C0894424080F8ED40"
		. "000004C89BC24300100004C89A42438010000448BBC24E0000"
		. "000448BA424080100004C89B424200100004189D64585E47E7"
		. "6488B9424E80000004D63DD4C039C24200100004863C54531C"
		. "94C8D44020290410FB608410FB650FF410FB640FE29D929FA4"
		. "189CA29F041C1FA1F4431D14429D14189D241C1FA1F4431D24"
		. "429D201CA89C1C1F91F31C829C801D04439F8430F9E040B498"
		. "3C1014983C0044539CC7FB0036C24084501E54183C601036C2"
		. "4104439B424100100000F856FFFFFFF4C8BB424200100004C8"
		. "BBC24300100004C8BA42438010000488B9C2440010000488B8"
		. "42440010000448B6B108B5B148B50048B400C895C241C488B9"
		. "C244001000089C68B5B18895C24188B9C240801000029D3443"
		. "9E8895C2414488B9C2440010000410F4CC589C78B842410010"
		. "0002B4308894424740F880906000089F04C89BC24300100004"
		. "C89A4243801000083E8014D89F4C744240800000000498D448"
		. "7044589EE48C744245800000000C744247C000000004189F74"
		. "189FD48894424488D42FF894424688B44241485C00F88EB000"
		. "000488B5C24588B84240001000001D8C1E0108944247889D82"
		. "B84245801000089C6B8000000000F49C631ED894424540FAF8"
		. "42408010000894424508B84245801000001D88944246C4889E"
		. "84489ED4989C58B44240844896C2410428D3C288B442418413"
		. "9C60F84BB0000004189C131C085ED448B44241C0F8EDA00000"
		. "04C8B9424300100004C8B9C2438010000EB2E66904139CE7E1"
		. "B418B148301FA4863D241803C1400740B4183E901782E0F1F4"
		. "400004883C00139C50F8E9A0000004139C789C17ECD418B148"
		. "201FA4863D241803C140174BD4183E80179B74983C50144396"
		. "C24140F8D68FFFFFF4189ED4883442458018BB424080100004"
		. "88B44245801742408394424740F8DE9FEFFFF8B4C247C89C84"
		. "881C4880000005B5E5F5D415C415D415E415FC34585FF7E2C4"
		. "88B9424300100008B4C241C4C8B4424488B0201F8489841803"
		. "C0401740583E901788C4883C2044939D075E58B44246803442"
		. "41083BC2448010000070F8EB4010000488B9C2440010000896"
		. "C24408BAC240801000044897C24304C896C2438C7442428070"
		. "000004189C54883C3204489742434897C24704989DF418B078"
		. "9EA29C28944242C8B8424500100004401E839C20F4EC24439E"
		. "8894424440F8CEF000000418B47148BBC2410010000412B7F0"
		. "4418B5708418B770C458B771089C38B44246C4C897C246039C"
		. "70F4FF8496347FC4189DF48C1E0024989C0480384243801000"
		. "04C0384243001000048894424208B5C24548B4424504401E83"
		. "9DF4189DA0F8C7C0000009085D27E254589F34531C9438B0C8"
		. "801C14863C941803C0C0174064183EB0178504983C1014439C"
		. "A7FE185F60F8E800000004439FE747B4C8B4C24204489FB453"
		. "1DBEB114183C3014983C10439F374624439DE7E5D418B0901C"
		. "14863C941803C0C0074E083EB0179DB0F1F840000000000418"
		. "3C20101E84439D77D854183C50144396C24440F8D5FFFFFFF4"
		. "C8B6C2438448B7C2430448B7424348B6C24404983C50144396"
		. "C24140F8D74FDFFFFE907FEFFFF8B44242C4C8B7C246083442"
		. "42807458D6C05FF4983C71C8B442428398424480100000F8F9"
		. "BFEFFFF448B7C2430448B7424348B6C24404C8B6C24388B7C2"
		. "470486344247C8B542410039424F8000000488B9C246001000"
		. "00B5424788D480181F9FF0300008914830F8FC1FDFFFF4585F"
		. "F7E22488B8424300100004C8B4424488B104883C00401FA493"
		. "9C04863D241C604140075EB4983C50144396C2414894C247C0"
		. "F8DC8FCFFFFE95BFDFFFF0F1F0083BC24D0000000010F84720"
		. "100008B8C24100100008B8424080100004531DB31DB85C98D3"
		. "485000000007E7B8BBC2408010000448BAC241001000085FF7"
		. "E5B488B9424E80000004C63D34C039424180100004863C5453"
		. "1C0488D4C02020F1F000FB6114883C104446BCA260FB651FB6"
		. "BC24B418D1401440FB649FA4489C8C1E0044429C801D0C1F80"
		. "7438804024983C0014439C77FCA01F501FB4183C301036C241"
		. "04539DD759483BC2410010000020F8E00FBFFFF488B8424180"
		. "100004863AC240801000041BD010000008B5C24144C89B4242"
		. "0010000488D78018B8424100100004D8D142E83E8018944241"
		. "08B842408010000448D58FD4983C30183BC240801000002488"
		. "D342F7E584C8D7435004889F231C90FB602440FB64AFF41B80"
		. "100000001D84439C87C27440FB64A014439C87C1D440FB60C0"
		. "F4439C87C13450FB6040E4439C0410F9CC00F1F80000000004"
		. "588440A014883C1014883C2014939CB75B24183C5014901EA4"
		. "4396C24104889F775894C8BB42420010000E935FAFFFF448B5"
		. "C24148B94241001000031DB8B84240801000031F6448B94240"
		. "80100004183C30141C1E30785D28D3C85000000000F8EFFF9F"
		. "FFF4585D27E52488B9424E80000004863C54C63CE4531C04D0"
		. "1F1488D4C02020FB6110FB641FF440FB669FE6BC04B6BD2260"
		. "1C24489E8C1E0044429E801D04139C3430F9704014983C0014"
		. "883C1044539C27FCC01FD4401D683C301036C2410399C24100"
		. "100007599E993F9FFFF31C9E956FBFFFF90909090909090"
		MCode(MyFunc, A_PtrSize=8 ? x64:x32)
	}
	return, DllCall(&MyFunc
	, "int",mode, "uint",color, "int",n, Ptr,Scan0
	, "int",Stride, "int",sx, "int",sy, "int",sw, "int",sh
	, Ptr,&gs, Ptr,&ss, "AStr",text, Ptr,&s1, Ptr,&s0
	, Ptr,&in, "int",num, "int",offsetX, "int",offsetY, Ptr,&allpos)
}


/***** C source code of machine code *****
	
	int __attribute__((__stdcall__)) PicFind(
	int mode, unsigned int c, int n, unsigned char * Bmp
	, int Stride, int sx, int sy, int sw, int sh
	, unsigned char * gs, char * ss
	, char * text, int * s1, int * s0
	, int err1, int err0, int w1, int h1, int * allpos)
	{
		int o, i, j, x, y, sx1, sy1, ok=0;
		int r, g, b, rr, gg, bb, e1, e0, len1, len0, max;
		// Generate Lookup Table
		o=len1=len0=0;
		for (y=0; y<h1; y++)
		{
			for (x=0; x<w1; x++)
			{
				i=mode==3 ? y*Stride+x*4 : y*sw+x;
				if (text[o++]=='1')
					s1[len1++]=i;
				else
					s0[len0++]=i;
			}
		}
		// This mode will not clear the image that has been found
		if (mode==3)  // Color Position Mode
		{
			sx1=sx+sw-w1; sy1=sy+sh-h1; max=len1>len0 ? len1 : len0;
			for (y=sy; y<=sy1; y++)
			{
				for (x=sx; x<=sx1; x++)
				{
					o=y*Stride+x*4; e1=err1; e0=err0;
					j=o+c; rr=Bmp[2+j]; gg=Bmp[1+j]; bb=Bmp[j];
					for (i=0; i<max; i++)
					{
						if (i<len1)
						{
							j=o+s1[i]; r=Bmp[2+j]-rr; g=Bmp[1+j]-gg; b=Bmp[j]-bb;
							if (r<0) r=-r; if (g<0) g=-g; if (b<0) b=-b;
								if (r+g+b>n && (--e1)<0) goto NoMatch2;
						}
						if (i<len0)
						{
							j=o+s0[i]; r=Bmp[2+j]-rr; g=Bmp[1+j]-gg; b=Bmp[j]-bb;
							if (r<0) r=-r; if (g<0) g=-g; if (b<0) b=-b;
								if (r+g+b<=n && (--e0)<0) goto NoMatch2;
						}
					}
					allpos[ok++]=y<<16|x;
					if (ok>=1024) goto Return1;
						NoMatch2:
					continue;
				}
			}
			goto Return1;
		}
		// Generate Two Value Image
		o=sy*Stride+sx*4; j=Stride-4*sw; i=0;
		if (mode==0)  // Color Mode
		{
			rr=(c>>16)&0xFF; gg=(c>>8)&0xFF; bb=c&0xFF;
			for (y=0; y<sh; y++, o+=j)
				for (x=0; x<sw; x++, o+=4, i++)
				{
					r=Bmp[2+o]-rr; g=Bmp[1+o]-gg; b=Bmp[o]-bb;
					if (r<0) r=-r; if (g<0) g=-g; if (b<0) b=-b;
						ss[i]=r+g+b<=n ? 1:0;
				}
		}
		else if (mode==1)  // Gray Threshold Mode
		{
			c=(c+1)*128;
			for (y=0; y<sh; y++, o+=j)
				for (x=0; x<sw; x++, o+=4, i++)
					ss[i]=Bmp[2+o]*38+Bmp[1+o]*75+Bmp[o]*15<c ? 1:0;
		}
		else  // (mode==2) Gray Difference Mode
		{
			for (y=0; y<sh; y++, o+=j)
			{
				for (x=0; x<sw; x++, o+=4, i++)
					gs[i]=(Bmp[2+o]*38+Bmp[1+o]*75+Bmp[o]*15)>>7;
			}
			sx1=sw-2; sy1=sh-2;
			for (y=1; y<=sy1; y++)
			{
				for (x=1; x<=sx1; x++)
				{
					i=y*sw+x; j=gs[i]+c;
					ss[i]=(gs[i-1]>j || gs[i+1]>j
					|| gs[i-sw]>j || gs[i+sw]>j) ? 1:0;
				}
			}
		}
		// Start Lookup
		sx1=sw-w1; sy1=sh-h1; max=len1>len0 ? len1 : len0;
		for (y=0; y<=sy1; y++)
		{
			for (x=0; x<=sx1; x++)
			{
				o=y*sw+x; e1=err1; e0=err0;
				if (e0==len0)
				{
					for (i=0; i<len1; i++)
						if (ss[o+s1[i]]!=1 && (--e1)<0) goto NoMatch1;
				}
				else
				{
					for (i=0; i<max; i++)
					{
						if (i<len1 && ss[o+s1[i]]!=1 && (--e1)<0) goto NoMatch1;
							if (i<len0 && ss[o+s0[i]]!=0 && (--e0)<0) goto NoMatch1;
					}
				}
				allpos[ok++]=(sy+y)<<16|(sx+x);
				if (ok>=1024) goto Return1;
					// Clear the image that has been found
				for (i=0; i<len1; i++) ss[o+s1[i]]=0;
					NoMatch1:
				continue;
			}
		}
		Return1:
		return ok;
	}
	
	
	int __attribute__((__stdcall__)) PicFind2(
	int mode, unsigned int c, int n, unsigned char * Bmp
	, int Stride, int sx, int sy, int sw, int sh
	, unsigned char * gs, char * ss
	, char * text, int * s1, int * s0
	, int * in, int num, int offsetX, int offsetY, int * allpos )
	{
		int o, i, j, x, y, r, g, b, rr, gg, bb, max, e1, e0, ok=0;
		int o1, x1, y1, w1, h1, sx1, sy1, len1, len0, err1, err0;
		int o2, x2, y2, w2, h2, sx2, sy2, len21, len20, err21, err20;
		// Generate Lookup Table
		for (j=0; j<num; j+=7)
		{
			o=o1=o2=in[j]; w1=in[j+1]; h1=in[j+2];
			for (y=0; y<h1; y++)
			{
				for (x=0; x<w1; x++)
				{
					i=y*sw+x;
					if (text[o++]=='1')
						s1[o1++]=i;
					else
						s0[o2++]=i;
				}
			}
		}
		// Generate Two Value Image
		o=sy*Stride+sx*4; j=Stride-4*sw; i=0;
		if (mode==0)  // Color Mode
		{
			rr=(c>>16)&0xFF; gg=(c>>8)&0xFF; bb=c&0xFF;
			for (y=0; y<sh; y++, o+=j)
				for (x=0; x<sw; x++, o+=4, i++)
				{
					r=Bmp[2+o]-rr; g=Bmp[1+o]-gg; b=Bmp[o]-bb;
					if (r<0) r=-r; if (g<0) g=-g; if (b<0) b=-b;
						ss[i]=r+g+b<=n ? 1:0;
				}
		}
		else if (mode==1)  // Gray Threshold Mode
		{
			c=(c+1)*128;
			for (y=0; y<sh; y++, o+=j)
				for (x=0; x<sw; x++, o+=4, i++)
					ss[i]=Bmp[2+o]*38+Bmp[1+o]*75+Bmp[o]*15<c ? 1:0;
		}
		else  // (mode==2) Gray Difference Mode
		{
			for (y=0; y<sh; y++, o+=j)
			{
				for (x=0; x<sw; x++, o+=4, i++)
					gs[i]=(Bmp[2+o]*38+Bmp[1+o]*75+Bmp[o]*15)>>7;
			}
			sx1=sw-2; sy1=sh-2;
			for (y=1; y<=sy1; y++)
			{
				for (x=1; x<=sx1; x++)
				{
					i=y*sw+x; j=gs[i]+c;
					ss[i]=(gs[i-1]>j || gs[i+1]>j
					|| gs[i-sw]>j || gs[i+sw]>j) ? 1:0;
				}
			}
		}
		// Start Lookup
		w1=in[1]; h1=in[2]; len1=in[3]; len0=in[4]; err1=in[5]; err0=in[6];
		sx1=sw-w1; sy1=sh-h1; max=len1>len0 ? len1 : len0;
		for (y=0; y<=sy1; y++)
		{
			for (x=0; x<=sx1; x++)
			{
				o=y*sw+x; e1=err1; e0=err0;
				if (e0==len0)
				{
					for (i=0; i<len1; i++)
						if (ss[o+s1[i]]!=1 && (--e1)<0) goto NoMatch1;
				}
				else
				{
					for (i=0; i<max; i++)
					{
						if (i<len1 && ss[o+s1[i]]!=1 && (--e1)<0) goto NoMatch1;
							if (i<len0 && ss[o+s0[i]]!=0 && (--e0)<0) goto NoMatch1;
					}
				}
				x1=x+w1-1; y1=y-offsetY; if (y1<0) y1=0;
				for (j=7; j<num; j+=7)
				{
					o2=in[j]; w2=in[j+1]; h2=in[j+2];
					len21=in[j+3]; len20=in[j+4]; err21=in[j+5]; err20=in[j+6];
					sx2=sw-w2; i=x1+offsetX; if (i<sx2) sx2=i;
					sy2=sh-h2; i=y+offsetY; if (i<sy2) sy2=i;
					for (x2=x1; x2<=sx2; x2++)
					{
						for (y2=y1; y2<=sy2; y2++)
						{
							o1=y2*sw+x2; e1=err21; e0=err20;
							for (i=0; i<len21; i++)
								if (ss[o1+s1[o2+i]]!=1 && (--e1)<0) goto NoMatch2;
									for (i=0; e0!=len20 && i<len20; i++)
										if (ss[o1+s0[o2+i]]!=0 && (--e0)<0) goto NoMatch2;
											goto MatchOK;
							NoMatch2:
							continue;
						}
					}
					goto NoMatch1;
					MatchOK:
					x1=x2+w2-1;
				}
				allpos[ok++]=(sy+y)<<16|(sx+x);
				if (ok>=1024) goto Return1;
					// Clear the image that has been found
				for (i=0; i<len1; i++) ss[o+s1[i]]=0;
					NoMatch1:
				continue;
			}
		}
		Return1:
		return ok;
	}
	
*/

;================= The End =================

;

Return to “Scripts and Functions (v1)”

Who is online

Users browsing this forum: No registered users and 68 guests