that would work, do you know the script for that? Thank youChunjee wrote: ↑20 Oct 2021, 14:01How about double clicking 50 pixels to the right of the found word?Shanghei wrote: ↑19 Oct 2021, 09:31Hello, I have find text setup to trigger if a certain word is posted, I was wondering if there was a way to setup a script to copy the word immediately following the trigger word.
So for example, lets say i have findtext setup to find the world "Hello"
and the phrase Hello world comes up
I want the script to copy the word "world"
thanks for help
FindText - Capture screen image into text and then find it
Re: FindText - Capture screen image into text and then find it
Re: FindText - Capture screen image into text and then find it
maybe something like:
Code: Select all
F1::
resultObj := ; FindClick(...)
; if at least one result is found
if (resultObj[1].x) {
; doubleclick 50 pixels to the left of the found location
mouseClick, left, % resultObj[1].x - 50, % resultObj[1].y, 2
}
return
Re: FindText - Capture screen image into text and then find it
Hello i have question
i want to make script that would collect stats from the game from image and then i could paste it into table
so basic idea i have item's name, rank and stats with either text or icons and stat value next to those stats
my first idea was make something like
im searching in exact zone for either text or image that's why findtext thing actually could fit(cos i dont care about text or image itself) but i just not sure if it could work like that
like first searching zone with name to find out which name it is when it find out proper one it copy it to somewhere
then same with rank and stats so basically i wanted to compare with 6(or about that) pics everytime to find out what it was and paste into some variable
but then i would need to gather info about values of those stats and i would need to use ocr to find out what numbers was
so my first question is if findtext is better then using original image search or something similar?
cos i understand that findtext can find text but how do i use it to compare current image to stored image while using it?
and 2nd if someone maybe have solution to something similar
i want to make script that would collect stats from the game from image and then i could paste it into table
so basic idea i have item's name, rank and stats with either text or icons and stat value next to those stats
my first idea was make something like
im searching in exact zone for either text or image that's why findtext thing actually could fit(cos i dont care about text or image itself) but i just not sure if it could work like that
like first searching zone with name to find out which name it is when it find out proper one it copy it to somewhere
then same with rank and stats so basically i wanted to compare with 6(or about that) pics everytime to find out what it was and paste into some variable
but then i would need to gather info about values of those stats and i would need to use ocr to find out what numbers was
so my first question is if findtext is better then using original image search or something similar?
cos i understand that findtext can find text but how do i use it to compare current image to stored image while using it?
and 2nd if someone maybe have solution to something similar
Re: FindText - Capture screen image into text and then find it
hello guys, this is working great so thanks for that, all I ask here is an additional function for my purposes if someone could quickly shed some light on solution
trying to memorize current mouse pointer position Y coordinates, then after mousemove to findtext image memorize X coordinates, then move mouse to these combined coordinates
for some reason it doesn't work any help appreciated!
p.s. (it doesn't need to move to findtext image just get the X coordinates from the findtext location)
trying to memorize current mouse pointer position Y coordinates, then after mousemove to findtext image memorize X coordinates, then move mouse to these combined coordinates
for some reason it doesn't work any help appreciated!
p.s. (it doesn't need to move to findtext image just get the X coordinates from the findtext location)
Code: Select all
f2::
;getcoordinates
CoordMode, Mouse, Screen
MouseGetPos, , MouseY
BlockInput, on
CoordMode, Screen
t1:=A_TickCount, X:=Y:=""
Text:="|<>*52$71.000000000001zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzbzzzzzzzzzzyDzzzzzzzzzzwTzzzzzzzzzzmzzzzzzzzzzzBzzzzzzzzzzy1zzzzzzzzzzzrzzzzzzzzzzzjzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
if (ok:=FindText(X, Y, 3, 2115, 2193, 2141, 0, 0, Text))
{
; FindText().Click(X, Y, "L")
}
WinGetPos, X, Y, W, H, % needle
if (ok:=FindText(X, Y, X+W, Y+H, 0, 0, Text))
{
x:=ok.1.1, y:=ok.1.2, w:=ok.1.3, h:=ok.1.4
;mousemove, X-1400, Y-700
mousemove, % X+W-10, % Y+H-8
}
CoordMode, Mouse, Screen
MouseGetPos, MouseX,
BlockInput, off
MouseMove, MouseX, MouseY
return
Re: FindText - Capture screen image into text and then find it
@maxkill This works for me. It stays in the Y position after the hotkey is pressed. But travels to the image searched X position.
Also it looks like you have old FINDTEXT code mixed with New code. x:=ok.1.1, y:=ok.1.2, w:=ok.1.3, h:=ok.1.4 <====== Is that old code?
Also where is your #include FINDTEXT function??
Anyways doesn't matter, the below code works for me. Just simply replace it with your 'image text string' and computer screen size or leave it at 1920 x 1080
Let me know if that is or isn't what you wanted.
Also it looks like you have old FINDTEXT code mixed with New code. x:=ok.1.1, y:=ok.1.2, w:=ok.1.3, h:=ok.1.4 <====== Is that old code?
Also where is your #include FINDTEXT function??
Anyways doesn't matter, the below code works for me. Just simply replace it with your 'image text string' and computer screen size or leave it at 1920 x 1080
Let me know if that is or isn't what you wanted.
Code: Select all
#NoEnv
SetWorkingDir %A_ScriptDir%
CoordMode, Mouse, Screen
SendMode Input
#SingleInstance, Force
SetTitleMatchMode 2
SetTitleMatchMode Fast
SetControlDelay 1
SetWinDelay 1
SetKeyDelay 1
SetMouseDelay 1
SetBatchLines 1
#Persistent
#Include <FindText>
b::
MouseGetPos, , MouseY
BlockInput, on
t1:=A_TickCount, X:=Y:=""
Text:="|<search>**50$14.Ty80nzmU8M260GU380m0AU3c0dzy01U0M06U"
if (ok:=FindText(X, Y, 0, 0, 1920, 1080, 0, 0, Text))
{
; FindText().Click(X, Y, "L")
}
BlockInput, off
MouseMove, X, MouseY
return
Re: FindText - Capture screen image into text and then find it
@SteveMylo
thanks a lot!!
I am now getting this message however edit:
Hold up, removed the line that was getting issue now seems to work let me check some more
testing now
edit2:
yes it's working great now
only thing is have have to run a new instance of the script beside my original one since all my old keys stops working with new code but I'll take it! this is great!! God Bless
thanks a lot!!
I am now getting this message however edit:
Hold up, removed the line that was getting issue now seems to work let me check some more
testing now
Code: Select all
f2::
#NoEnv
SetWorkingDir %A_ScriptDir%
CoordMode, Mouse, Screen
SendMode Input
#SingleInstance, Force
SetTitleMatchMode 2
SetTitleMatchMode Fast
SetControlDelay 1
SetWinDelay 1
SetKeyDelay 1
SetMouseDelay 1
SetBatchLines 1
#Persistent
MouseGetPos, , MouseY
BlockInput, on
t1:=A_TickCount, X:=Y:=""
Text:="|<search>*52$71.000000000001zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzbzzzzzzzzzzyDzzzzzzzzzzwTzzzzzzzzzzmzzzzzzzzzzzBzzzzzzzzzzy1zzzzzzzzzzzrzzzzzzzzzzzjzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
if (ok:=FindText(X, Y, 3, 2115, 2193, 2141, 0, 0, Text))
{
; FindText().Click(X, Y, "L")
}
BlockInput, off
MouseMove, X, MouseY
return
yes it's working great now
only thing is have have to run a new instance of the script beside my original one since all my old keys stops working with new code but I'll take it! this is great!! God Bless
Re: FindText - Capture screen image into text and then find it
Great. But i’m confused. How is the script working without the #include FINDTEXT function? Haha
You should be pointing the #include to your own FINDTEXT function you’ve downloaded
You should be pointing the #include to your own FINDTEXT function you’ve downloaded
Re: FindText - Capture screen image into text and then find it
@SteveMylo
lol, I just pasted the new code and your edit without the #include line and it worked
lol, I just pasted the new code and your edit without the #include line and it worked
Code: Select all
f2::
#NoEnv
SetWorkingDir %A_ScriptDir%
CoordMode, Mouse, Screen
SendMode Input
#SingleInstance, Force
SetTitleMatchMode 2
SetTitleMatchMode Fast
SetControlDelay 1
SetWinDelay 1
SetKeyDelay 1
SetMouseDelay 1
SetBatchLines 1
#Persistent
MouseGetPos, , MouseY
BlockInput, on
t1:=A_TickCount, X:=Y:=""
Text:="|<search>*52$71.000000000001zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzbzzzzzzzzzzyDzzzzzzzzzzwTzzzzzzzzzzmzzzzzzzzzzzBzzzzzzzzzzy1zzzzzzzzzzzrzzzzzzzzzzzjzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
if (ok:=FindText(X, Y, 3, 2115, 2193, 2141, 0, 0, Text))
{
; FindText().Click(X, Y, "L")
}
MouseMove, X, MouseY
mouseclick, left
BlockInput, off
return
;+§
;Text:="|<crosshair>*80$17.zzzzzzzTzsDzZDyPDtrDrjT00TSxyRnyPjyIzy3zzTzzzzzzk"
;===== Copy The Following Functions To Your Own Code Just once =====
;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
;/*
;===========================================
; FindText - Capture screen image into text and then find it
; https://autohotkey.com/boards/viewtopic.php?f=6&t=17834
;
; Author : FeiYue
; Version : 8.6
; Date : 2021-09-12
;
; Usage: (required AHK v1.1.31+)
; 1. Capture the image to text string.
; 2. Test find the text string on full Screen.
; 3. When test is successful, you may copy the code
; and paste it into your own script.
; Note: Copy the "FindText()" function and the following
; functions and paste it into your own script Just once.
; 4. The more recommended way is to save the script as
; "FindText.ahk" and copy it to the "Lib" subdirectory
; of AHK program, instead of copying the "FindText()"
; function and the following functions, add a line to
; the beginning of your script: #Include <FindText>
; 5. If you want to call a method in the FindTextClass class,
; use the parameterless FindText() to get the default object
;
;===========================================
;*/
if (!A_IsCompiled and A_LineFile=A_ScriptFullPath)
FindText().Gui("Show")
;===== Copy The Following Functions To Your Own Code Just once =====
;--------------------------------
; FindText - Capture screen image into text and then find it
;--------------------------------
; returnArray := FindText(
; OutputX --> The name of the variable used to store the returned X coordinate
; , OutputY --> The name of the variable used to store the returned Y coordinate
; , X1 --> the search scope's upper left corner X coordinates
; , Y1 --> the search scope's upper left corner Y coordinates
; , X2 --> the search scope's lower right corner X coordinates
; , Y2 --> the search scope's lower right corner Y coordinates
; , err1 --> Fault tolerance percentage of text (0.1=10%)
; , err0 --> Fault tolerance percentage of background (0.1=10%)
; , Text --> can be a lot of text parsed into images, separated by "|"
; , ScreenShot --> if the value is 0, the last screenshot will be used
; , FindAll --> if the value is 0, Just find one result and return
; , JoinText --> if the value is 1, Join all Text for combination lookup
; , offsetX --> Set the max text offset (X) for combination lookup
; , offsetY --> Set the max text offset (Y) for combination lookup
; , dir --> Nine directions for searching: up, down, left, right and center
; )
;
; The function returns a second-order array containing
; all lookup results, Any result is an associative array
; {1:X, 2:Y, 3:W, 4:H, x:X+W//2, y:Y+H//2, id:Comment}
; if no image is found, the function returns 0.
; All coordinates are relative to Screen, colors are in RGB format
;
; If the return variable is set to "ok", ok[1] is the first result found.
; ok[1][1], ok[1][2] is the X, Y coordinate of the upper left corner of the found image,
; ok[1][3] is the width of the found image, and ok[1][4] is the height of the found image,
; ok[1].x <==> ok[1][1]+ok[1][3]//2 ( is the Center X coordinate of the found image ),
; ok[1].y <==> ok[1][2]+ok[1][4]//2 ( is the Center Y coordinate of the found image ),
; ok[1].id is the comment text, which is included in the <> of its parameter.
;
; If OutputX is equal to "wait" or "wait1"(appear), or "wait0"(disappear)
; it means using a loop to wait for the image to appear or disappear.
; the OutputY is the wait time in seconds, time less than 0 means infinite waiting
; Timeout means failure, return 0, and return other values means success
; If you want to appear and the image is found, return the found array object
; If you want to disappear and the image cannot be found, return 1
; Example 1: FindText("wait",3, 0,0,0,0,0,0,Text) ; Wait 3 seconds for appear
; Example 2: FindText("wait0",-1, 0,0,0,0,0,0,Text) ; Wait indefinitely for disappear
;--------------------------------
FindText(ByRef x:="FindTextObject", ByRef y:="", args*)
{
static obj:=new FindTextClass()
if (x=="FindTextObject")
return obj
else
return obj.FindText(x, y, args*)
}
Class FindTextClass
{ ;// Class Begin
static bind:=[], bits:=[], Lib:=[], Cursor:=0
__New()
{
this.bind:=[], this.bits:=[], this.Lib:=[], this.Cursor:=0
}
__Delete()
{
if (this.bits.hBM)
DllCall("DeleteObject", "Ptr",this.bits.hBM)
}
FindText(ByRef OutputX:="", ByRef OutputY:=""
, x1:=0, y1:=0, x2:=0, y2:=0, err1:=0, err0:=0
, text:="", ScreenShot:=1, FindAll:=1
, JoinText:=0, offsetX:=20, offsetY:=10, dir:=1)
{
local
if RegExMatch(OutputX, "i)^\s*wait[10]?\s*$")
{
found:=!InStr(OutputX,"0"), time:=OutputY
, timeout:=A_TickCount+Round(Abs(time)*1000)
, OutputX:=OutputY:=""
Loop
{
ok:=this.FindText(OutputX, OutputY
, x1, y1, x2, y2, err1, err0
, text, ScreenShot, FindAll
, JoinText, offsetX, offsetY, dir)
if (found and ok)
return ok
else if (!found and !ok)
return 1
if (time>=0 and A_TickCount>=timeout)
Break
Sleep, 100
}
return 0
}
SetBatchLines, % (bch:=A_BatchLines)?"-1":"-1"
centerX:=Round(x1+x2)//2, centerY:=Round(y1+y2)//2
if (x1*x1+y1*y1+x2*x2+y2*y2<=0)
n:=150000, x:=y:=-n, w:=h:=2*n
else
x:=Min(x1,x2), y:=Min(y1,y2), w:=Abs(x2-x1)+1, h:=Abs(y2-y1)+1
bits:=this.GetBitsFromScreen(x,y,w,h,ScreenShot,zx,zy,zw,zh)
, info:=[]
Loop Parse, text, |
if IsObject(j:=this.PicInfo(A_LoopField))
info.Push(j)
if (w<1 or h<1 or !(num:=info.Length()) or !bits.Scan0)
{
SetBatchLines, %bch%
return 0
}
arr:=[], ini:={zx:zx, zy:zy, zw:zw, zh:zh
, sx:x-zx, sy:y-zy, sw:w, sh:h, comment:""}, k:=0
For i,j in info
k:=Max(k, j[2]*j[3]), ini.comment .= j[11]
VarSetCapacity(s1, k*4), VarSetCapacity(s0, k*4)
, VarSetCapacity(ss, 2*(w+2)*(h+2))
, FindAll:=(dir=9 ? 1 : FindAll)
, JoinText:=(num=1 ? 0 : JoinText)
, allpos_max:=(FindAll or JoinText ? 10240 : 1)
, VarSetCapacity(allpos, allpos_max*8)
Loop 2
{
if (err1=0 and err0=0) and (num>1 or A_Index>1)
err1:=0.05, err0:=0.05
Loop % JoinText ? 1 : num
{
this.PicFind(arr, ini, info, A_Index, err1, err0
, FindAll, JoinText, offsetX, offsetY, dir
, bits, ss, s1, s0, allpos, allpos_max)
if (!FindAll and arr.Length())
Break
}
if (err1!=0 or err0!=0 or arr.Length() or info[1][12])
Break
}
if (dir=9)
arr:=this.Sort2(arr, centerX, centerY)
SetBatchLines, %bch%
if (arr.Length())
{
OutputX:=arr[1].x, OutputY:=arr[1].y
return arr
}
return 0
}
PicFind(arr, ini, info, index, err1, err0
, FindAll, JoinText, offsetX, offsetY, dir
, bits, ByRef ss, ByRef s1, ByRef s0
, ByRef allpos, allpos_max)
{
local
static MyFunc:=""
if (!MyFunc)
{
x32:=""
. "5557565383EC648B6C247883FD050F84AB0800008BB424BC000000C744240C00"
. "00000085F60F8E1A0D000031FF31C0896C2478C74424080000000031C9C74424"
. "1400000000897C241089C5908D7426008B5C24108BBC24B80000008B7424148B"
. "54240C01DF89D829DE8B9C24B800000003B424B400000085DB7E58893C2489EB"
. "89D7EB198BAC24B000000083C70483C00189548D0083C1013904247429837C24"
. "780389FA0F45D0803C063175D78BAC24AC00000083C70483C00189549D0083C3"
. "0139042475D78BB424B80000000174241489DD83442408018BBC24A00000008B"
. "442408017C24108B9C248C000000015C240C398424BC0000000F8551FFFFFF89"
. "6C24088B6C2478894C240C31C08B74240839B424C00000008B7C240C0F4DF039"
. "BC24C4000000897424080F4CC739C68944240C0F4DC683FD038904240F848E08"
. "00008B84248C0000008BB424980000000FAF84249C000000C1E6028974243401"
. "F08BB4248C000000894424308B8424A0000000F7D885ED8D0486894424200F85"
. "800300008B44247CC744241C00000000C744242400000000C1E8100FB6E88B44"
. "247C0FB6C4894424100FB644247C894424148B8424A0000000C1E0028944242C"
. "8B8424A400000085C00F8EC60000008B7C24048B442430896C24188BAC24A000"
. "000085ED0F8E8D0000008BB424880000008B6C242403AC24A800000001C60344"
. "242C8944242803842488000000894424040FB67E028B4C24180FB6160FB64601"
. "2B5424142B44241089FB01CF29CB8D8F000400000FAFC00FAFCBC1E00B0FAFCB"
. "BBFE05000029FB0FAFDA01C10FAFD301CA399424800000000F93450083C60483"
. "C5013B74240475A98B9C24A0000000015C24248B4424288344241C0103442420"
. "8B74241C39B424A40000000F854AFFFFFF897C24048B8424A00000002B8424B8"
. "000000C644244B00C644244A00C744245000000000C744245C00000000894424"
. "548B8424A40000002B8424BC000000894424388B84248400000083E80183F807"
. "0F87BC05000083F803894424400F8EB70500008B44245C8B7424508944245089"
. "74245C8B742454397424500F8F410A00008B4424548B742408C744242C000000"
. "00894424588B8424AC0000008D04B08B7424408944244C89F083E00189442444"
. "89F08BB4248800000083E003894424608B44245C8B7C243839F80F8F7E010000"
. "837C2460018B4C24500F4F4C2458897C24288944241C894C243C8DB600000000"
. "8B7C24448B44242885FF0F4444241C837C244003894424200F8FC2020000807C"
. "244A008B44243C894424248B4424240F85CA020000807C244B000F8570030000"
. "0FAF8424A00000008B14248B5C242085D28D2C180F8E850000008BBC24C40000"
. "008B9424A800000031C08B9C24C0000000896C24308B4C24088974241801EA89"
. "7C24148B2C248B7C240C895C2410669039C17E1C8B9C24AC0000008B348301D6"
. "803E00750B836C2410010F885004000039C77E1C8B9C24B00000008B348301D6"
. "803E00740B836C2414010F883004000083C00139E875B98B6C24308B7424188B"
. "44240885C074278BBC24A80000008B8424AC0000008B5C244C8D0C2F8D742600"
. "8B1083C00401CA39D8C6020075F28B442420038424980000008B5C242C8BBC24"
. "C80000008904DF8B4424240384249C0000008944DF0483C3013B9C24CC000000"
. "895C242C7D308344241C01836C2428018B44241C394424380F8DA2FEFFFF8344"
. "245001836C2458018B442450394424540F8D5AFEFFFF8B44242C83C4645B5E5F"
. "5DC2580083FD010F847207000083FD020F84DB0400008B44247C0FB67C247CC7"
. "44242800000000C744242C00000000C1E8100FB6D08B44247C89D50FB6DC8B84"
. "2480000000C1E8100FB6C88B84248000000029CD01D1896C243889DD894C2410"
. "0FB6F40FB684248000000029F501DE896C241489FD8974241829C501F8894424"
. "248B8424A0000000896C241CC1E002894424348B8424A400000085C00F8EF3FC"
. "FFFF8B4C24308B6C24388B8424A000000085C00F8E880000008B842488000000"
. "8B54242C039424A800000001C8034C243489CF894C243003BC2488000000EB34"
. "395C24107C3D394C24147F37394C24187C3189F30FB6F33974241C0F9EC33974"
. "24240F9DC183C00483C20121D9884AFF39C7741E0FB658020FB648010FB63039"
. "DD7EBD31C983C00483C201884AFF39C775E28BB424A00000000174242C8B4C24"
. "308344242801034C24208B442428398424A40000000F854FFFFFFFE935FCFFFF"
. "8B442420807C244A00894424248B44243C894424208B4424240F8436FDFFFF0F"
. "AF84248C0000008B1C248B4C242085DB8D2C880F8EF5FDFFFF8BBC24C0000000"
. "31C9896C24108D76008DBC27000000008B8424AC0000008B5C2410031C888B84"
. "24B00000008B2C880FB6441E0289EAC1EA100FB6D229D00FB6541E010FB61C1E"
. "0FAFC03B4424047F2789E80FB6C429C20FAFD23B5424047F1789E80FB6C029C3"
. "0FAFDB3B5C24047E108DB4260000000083EF010F887701000083C1013B0C2475"
. "8F896C247CE964FDFFFF8DB6000000000FAF84248C0000008B4C24208D048889"
. "4424100344247C0FB64C06010FB67C06020FB60406894C24148B0C2489442418"
. "85C90F8E26FDFFFF8B8424C400000031DB894424348B8424C000000089442430"
. "8B442404897C2404908DB42600000000395C24087E658B8424AC0000008B4C24"
. "108B7C2404030C980FB6440E020FB6540E010FB60C0E2B5424142B4C241889C5"
. "01F829FD8DB8000400000FAFD20FAFFDC1E20B0FAFFDBDFE05000029C50FAFE9"
. "01FA0FAFCD01D1398C2480000000730B836C2430010F889E000000395C240C7E"
. "618B8424B00000008B4C24108B7C2404030C980FB6440E020FB6540E010FB60C"
. "0E2B5424142B4C241889C501F829FD8DB8000400000FAFD20FAFFDC1E20B0FAF"
. "FDBDFE05000029C50FAFE901FA0FAFCD01D1398C24800000007207836C243401"
. "783783C3013B1C240F8522FFFFFF89442404E917FCFFFF89F68DBC2700000000"
. "8B742418E93DFCFFFF8DB42600000000896C247CE92DFCFFFF89442404E924FC"
. "FFFFC7442440000000008B4424388B7424548944245489742438E944FAFFFF8B"
. "84248000000031C931F631FF8904248B44247CC744247C000000000FAFC08944"
. "24048B8424B40000000FB6108D5801EB2789FA8B8C24AC0000000FB7FFC1EA10"
. "0FAF94248C0000008D14BA31FF8914B10FB61389C183C3010FBEC285C0743A8D"
. "50D083FA0977078D14BF8D7C50D083F82F74070FB61384D275DB89C883F00185"
. "C974AE8B8C24B0000000893CB189C10FB61383C60131FFEBBC897C247C83FD05"
. "8B8424A00000000F9444244A83FD030F9444244B038424980000002B8424B800"
. "0000894424548B84249C000000038424A40000002B8424BC000000894424388B"
. "84249C000000C784249C00000000000000894424508B842498000000C7842498"
. "000000000000008944245CE903F9FFFF8B44247C31D2F7B424B80000000FAF84"
. "248C0000008D04908944247CE96CFFFFFF8B8424A00000008BB4249C0000000F"
. "AF8424A400000083EE01038424A800000089742410894424188B8424A0000000"
. "038424980000008944241C8B84249C000000038424A400000039F00F8C080100"
. "008BB4249800000083C0012BAC2498000000894424288B44241CC74424240000"
. "000083EE018974242C8B74241001C50FAFB4248C0000008D7801896C24308974"
. "24208B44242C3944241C0F8C9B0000008B4C24108B5C24208B742424035C2434"
. "2BB42498000000039C2488000000C1E91F03742418894C2414EB50908D742600"
. "398424900000007E4B807C24140075448B4C2410398C24940000007E370FB64B"
. "FE0FB653FD83C3040FB66BF86BD24B6BC92601D189EAC1E20429EA01CAC1FA07"
. "8854060183C00139F8741889C2C1EA1F84D274ACC64406010083C00183C30439"
. "F875E88B7424300174242483442410018B9C248C0000008B442410015C242039"
. "4424280F8539FFFFFF8B8424A00000008B8C24A400000083C00285C98944241C"
. "0F8E2FF7FFFF8B8424A40000008B6C2418036C241CC744241801000000C74424"
. "200000000083C001894424248B8424A0000000896C241483C004894424288B84"
. "24800000008B9424A000000085D20F8EA40000008B4424148B5C24208B742428"
. "039C24A800000089C12B8C24A000000089C201C6894C2410908DB42600000000"
. "0FB642010FB62ABF010000000344247C39E8723D0FB66A0239E872358B4C2410"
. "0FB669FF39E872290FB66EFF39E872210FB669FE39E872190FB62939E872120F"
. "B66EFE39E8720A0FB63E39F80F92C189CF89F9834424100183C201880B83C601"
. "83C3018B4C2410394C241475938BBC24A0000000017C242083442418018B5C24"
. "1C8B742418015C2414397424240F8532FFFFFF89842480000000E916F6FFFF8B"
. "44247C8BB424A400000031EDC7442414000000008D48018B8424A0000000C1E1"
. "07C1E00285F6894C247C894424180F8EE1F5FFFF896C24108B4424308B6C247C"
. "8B9C24A000000085DB7E5F8B8C24880000008B5C2414039C24A800000001C103"
. "4424188944241C0384248800000089C70FB651020FB641010FB6316BC04B6BD2"
. "2601C289F0C1E00429F001D039C50F970383C10483C30139F975D58BBC24A000"
. "0000017C24148B44241C8344241001034424208B74241039B424A40000007580"
. "E950F5FFFFC744240800000000E9B9F3FFFFC744242C00000000E997F7FFFF90"
x64:=""
. "4157415641554154555756534881EC88000000488BBC24F0000000488BB42430"
. "01000083F90589542468448944240844898C24E8000000488B9C243801000048"
. "8BAC24400100000F84300900008B8424580100004531ED4531E485C00F8EDC00"
. "0000448974240C448BB4245001000031D231C04889BC24F00000004889B42430"
. "0100004531FF4531ED4531E4C704240000000089D789C6660F1F840000000000"
. "4585F67E6548631424478D1C3E4489F848039424480100004189F8EB1F0F1F00"
. "83C0014D63D54183C0044183C5014883C2014139C346894C9500742A83F90345"
. "89C1440F45C8803A3175D583C0014D63D44183C0044183C4014883C2014139C3"
. "46890C9375D64401342483C6014403BC242001000003BC24F800000039B42458"
. "0100000F8577FFFFFF448B74240C488BBC24F0000000488BB4243001000031C0"
. "4439A42460010000440F4DE04439AC2468010000440F4DE84539EC4589EF450F"
. "4DFC83F9030F84270900008B8424F80000008B9424100100000FAF8424180100"
. "008D04908B9424F8000000894424208B842420010000F7D885C98D0482890424"
. "0F85C40300008B4C24684889C84189CB0FB6C441C1EB1089C20FB6C1450FB6DB"
. "4189C28B84242801000085C00F8E370100008B842420010000448964242831C9"
. "44896C24304889B42430010000448B6C2420448B6424088BB42420010000C1E0"
. "0244897C24184889BC24F00000004889AC24400100004189CFC744240C000000"
. "008944241089D748899C24380100004489D585F60F8E8A000000488B9C24F000"
. "00004963C54531D24C8D4C030248635C240C48039C2430010000660F1F440000"
. "450FB631410FB651FE410FB641FF29EA4489F14501DE4189D0418D9600040000"
. "4429D929F80FAFD10FAFC00FAFD1C1E00B8D0402BAFE0500004429F2410FAFD0"
. "410FAFD001D04139C4420F9304134983C2014983C1044439D67FA544036C2410"
. "0174240C4183C70144032C244439BC24280100000F8558FFFFFF448B7C241844"
. "8B642428448B6C2430488BBC24F0000000488BB42430010000488B9C24380100"
. "00488BAC24400100008B8424200100002B842450010000C644245700C644244C"
. "00C744246C00000000C744247800000000894424708B8424280100002B842458"
. "010000894424408B8424E800000083E80183F8070F870606000083F803894424"
. "480F8E010600008B4424788B4C246C8944246C894C24788B4C2470394C246C0F"
. "8F350B00008B4424708B4C244848899C24380100004889AC24400100004489ED"
. "4589E5C74424300000000089442474418D4424FF4C8BA42440010000488D4483"
. "044889F3488BB42438010000488944246089C883E0018944245089C883E00389"
. "44247C4489F04589FE4189C78B4424788B4C244039C80F8F3E010000837C247C"
. "018B54246C0F4F542474894C2428890424895424448B44245085C08B4424280F"
. "440424837C2448038944240C0F8FCF020000807C244C008B442444894424100F"
. "85D7020000807C2457000F85700300008B4C24100FAF8C2420010000034C240C"
. "4585F67E59448B942468010000448B8C246001000031C0660F1F840000000000"
. "4139C589C27E184189C84403048642803C0300750A4183E9010F888500000039"
. "D57E1289CA41031484803C130074064183EA01786F4883C0014139C67FC24585"
. "ED741E4C8B4424604889F00F1F44000089CA03104883C0044C39C0C604130075"
. "EF8B4C24308B54240C039424100100004C8B94247001000089C801C048984189"
. "14828B54241003942418010000418954820489C883C0013B8424780100008944"
. "24307D2E83042401836C2428018B0424394424400F8DDBFEFFFF8344246C0183"
. "6C2474018B44246C394424700F8D9AFEFFFF8B4424304881C4880000005B5E5F"
. "5D415C415D415E415FC383F9010F847108000083F9020F84370500008B542468"
. "448B542408C744241000000000C74424180000000089D0440FB6C2C1E810440F"
. "B6C84889D00FB6CC4489D04589CBC1E810894C240C0FB6D04C89D00FB6C44129"
. "D34401CA89C18B44240C29C8034C240C89442430410FB6C24589C24129C24401"
. "C0448B8424280100008944240C8B842420010000C1E0024585C0894424280F8E"
. "05FDFFFF448974243C44896C244448899C2438010000448B742420448B6C2430"
. "8B9C242001000044897C243844896424404189CF4889AC24400100004189D444"
. "89D585DB7E784C635424184963C631D2488D4407024901F2EB37660F1F440000"
. "4539C47C3E4139CD7F394139CF7C344439CD410F9EC044394C240C0F9DC14883"
. "C0044421C141880C124883C20139D37E24440FB6000FB648FF440FB648FE4539"
. "C37EBD31C94883C00441880C124883C20139D37FDC4403742428015C24188344"
. "241001440334248B442410398424280100000F856AFFFFFF448B7C2438448B74"
. "243C448B642440448B6C2444488B9C2438010000488BAC2440010000E908FCFF"
. "FF8B44240C807C244C00894424108B4424448944240C0F8429FDFFFF8B442410"
. "8B4C240C0FAF8424F80000004585F6448D14880F8EA8FDFFFF448B8C24600100"
. "004531C04989DB660F1F840000000000428B1486438B1C844401D289D98D4202"
. "C1E9100FB6C948980FB6040729C88D4A014863D20FAFC00FB614174863C90FB6"
. "0C0F4439F87F1A0FB6C729C10FAFC94439F97F0D0FB6C329C20FAFD24439FA7E"
. "0A4183E9010F88950100004983C0014539C67F9C895C24684C89DBE921FDFFFF"
. "8B4424108B4C240C0FAF8424F80000008D048889C1034424684585F68D500248"
. "63D2440FB614178D500148980FB604074863D20FB614170F8EE4FCFFFF448B9C"
. "246801000048895C24584531C948897424184C8964242089CB89C64189D44489"
. "5C243C448B9C246001000044895C24384539CD4589C87E6E488B442418428B14"
. "8801DA8D42024898440FB63C078D42014863D20FB6141748980FB604074589FB"
. "4501D7418D8F000400004529D329F2410FAFCB4429E00FAFC0410FAFCB41BBFE"
. "050000C1E00B4529FB440FAFDA01C8410FAFD301C239542408730B836C243801"
. "0F88A60000004439C57E6A488B442420428B148801DA8D42024898440FB63C07"
. "8D42014863D20FB6141748980FB604074589F84501D7418D8F000400004529D0"
. "29F2410FAFC84429E00FAFC0410FAFC841B8FE050000C1E00B4529F8440FAFC2"
. "01C8410FAFD001C2395424087207836C243C0178374983C1014539CE0F8F0EFF"
. "FFFF488B5C2458488B7424184C8B642420E9ABFBFFFF662E0F1F840000000000"
. "895C24684C89DBE9D8FBFFFF488B5C2458488B7424184C8B642420E9C4FBFFFF"
. "C7442448000000008B4424408B4C247089442470894C2440E9FAF9FFFF8B4424"
. "68448B7C24084531C04531DB4531C94189C6440FAFF0488B8424480100000FB6"
. "104C8D5001EB2B4489CA450FB7C94D63C3C1EA100FAF9424F8000000428D148A"
. "4531C942891483410FB6124189C04983C2010FBEC285C074418D50D083FA0977"
. "09438D1489448D4C50D083F82F7408410FB61284D275D74489C083F0014585C0"
. "74A54963D34189C04183C30144894C95004531C9410FB612EBB444894C246883"
. "F9058B8424200100000F9444244C83F9030F94442457038424100100002B8424"
. "50010000894424708B842418010000038424280100002B842458010000894424"
. "408B842418010000C7842418010000000000008944246C8B842410010000C784"
. "24100100000000000089442478E9B5F8FFFF8B44246831D2F7B424500100000F"
. "AF8424F80000008D049089442468E96CFFFFFF8B8424200100008B9424180100"
. "000FAF842428010000448D5AFF48984801F0488904248B842420010000038424"
. "100100008944240C8B842418010000038424280100004439D80F8C610100008B"
. "94241001000083C001448B9424F8000000894424282B8C241001000044896424"
. "48448BA4240001000083EA01C74424180000000044897C24408D049500000000"
. "895424384489742444450FAFD344896C244C48899C2438010000894424204898"
. "48894424308B44240C448954241001C1448D5001894C243C8B4424383944240C"
. "0F8CA40000008B4C24108B5424204589DE488B5C24304C6344241841C1EE1F4C"
. "03042401CA4C63F94863D24C8D0C174829D3EB514139C47E554584F675504439"
. "9C24080100007E46410FB64902410FB6510183C0014983C0016BD24B6BC92601"
. "D14A8D140B4983C104460FB62C3A4489EAC1E2044429EA01D1C1F907418848FF"
. "4139C2741D89C2C1EA1F84D274A683C00141C600004983C1044983C0014139C2"
. "75E38B5C243C015C24184183C3018B9C24F8000000015C241044395C24280F85"
. "34FFFFFF448B7C2440448B742444448B642448448B6C244C488B9C2438010000"
. "8B842420010000448B94242801000083C0024585D20F8E8EF6FFFF488B0C2448"
. "9844897C24384889442410448B7C246848899C2438010000C704240100000048"
. "8D440101C744240C00000000448974243C4889C18B8424280100004889CB83C0"
. "01894424184863842420010000488D500348F7D048894424288B842420010000"
. "48895424208B54240883E8014883C0014889442430448B8C24200100004585C9"
. "0F8EAD000000488B44242048634C240C4C8D0C18488B4424284801F14C8D0418"
. "488B4424304C8D34184889D80F1F40000FB610440FB650FF41BB010000004401"
. "FA4439D2724A440FB650014439D27240450FB650FF4439D27236450FB651FF44"
. "39D2722C450FB650FE4439D27222450FB6104439D27219450FB651FE4439D272"
. "0F450FB6114439D2410F92C30F1F40004883C0014488194983C1014883C10149"
. "83C0014C39F075888B8C2420010000014C240C8304240148035C24108B042439"
. "4424180F852CFFFFFF448B7C2438448B74243C89542408488B9C2438010000E9"
. "25F5FFFF8B8424200100008B5424684531DBC744240C00000000C1E00283C201"
. "894424108B842428010000C1E2078954246885C00F8EEFF4FFFF44897C241848"
. "899C2438010000448B7C2468448B9424200100008B5C242044897424284585D2"
. "7E504C6374240C4863C34531C0488D4C07024901F60FB6110FB641FF440FB649"
. "FE6BC04B6BD22601C24489C8C1E0044429C801D04139C7430F9704064983C001"
. "4883C1044539C27FCC035C2410440154240C4183C301031C2444399C24280100"
. "00759A448B7C2418448B742428488B9C2438010000E94FF4FFFFC74424300000"
. "0000E98BF6FFFF909090909090909090"
this.MCode(MyFunc, A_PtrSize=8 ? x64:x32)
}
num:=info.Length(), j:=info[index]
, text:=j[1], w:=j[2], h:=j[3]
, e1:=(!j[12] ? Floor(j[4]*err1) : j[6])
, e0:=(!j[12] ? Floor(j[5]*err0) : j[7])
, mode:=j[8], color:=j[9], n:=j[10], comment:=j[11]
, sx:=ini.sx, sy:=ini.sy, sw:=ini.sw, sh:=ini.sh
if (JoinText and index>1)
{
x:=ini.x, y:=ini.y, sw:=Min(x+offsetX+w,sx+sw), sx:=x, sw-=sx
, sh:=Min(y+offsetY+h,sy+sh), sy:=Max(y-offsetY,sy), sh-=sy
}
ok:=!bits.Scan0 ? 0 : DllCall(&MyFunc
, "int",mode, "uint",color, "uint",n, "int",dir
, "Ptr",bits.Scan0, "int",bits.Stride
, "int",ini.zw, "int",ini.zh
, "int",sx, "int",sy, "int",sw, "int",sh
, "Ptr",&ss, "Ptr",&s1, "Ptr",&s0
, "AStr",text, "int",w, "int",h, "int",e1, "int",e0
, "Ptr",&allpos, "int",allpos_max)
pos:=[]
Loop % ok
pos[A_Index]:=NumGet(allpos, 8*A_Index-8, "uint")
| NumGet(allpos, 8*A_Index-4, "uint")<<32
Loop % ok
{
x:=pos[A_Index], y:=x>>32, x:=x&0xFFFFFFFF
if (!JoinText)
{
x1:=x+ini.zx, y1:=y+ini.zy
, arr.Push( {1:x1, 2:y1, 3:w, 4:h
, x:x1+w//2, y:y1+h//2, id:comment} )
}
else if (index=1)
{
ini.x:=x+w, ini.y:=y, ini.minY:=y, ini.maxY:=y+h
Loop % num-1
if !this.PicFind(arr, ini, info, A_Index+1, err1, err0
, FindAll, JoinText, offsetX, offsetY, 5
, bits, ss, s1, s0, allpos, 1)
Continue, 2
x1:=x+ini.zx, y1:=ini.minY+ini.zy
, w1:=ini.x-x, h1:=ini.maxY-ini.minY
, arr.Push( {1:x1, 2:y1, 3:w1, 4:h1
, x:x1+w1//2, y:y1+h1//2, id:ini.comment} )
}
else
{
ini.x:=x+w, ini.y:=y
, (y<ini.minY && ini.minY:=y)
, (y+h>ini.maxY && ini.maxY:=y+h)
return 1
}
if (!FindAll and arr.Length())
return
}
}
GetBitsFromScreen(ByRef x, ByRef y, ByRef w, ByRef h
, ScreenShot:=1, ByRef zx:="", ByRef zy:=""
, ByRef zw:="", ByRef zh:="")
{
local
bits:=this.bits
if (!ScreenShot)
{
zx:=bits.zx, zy:=bits.zy, zw:=bits.zw, zh:=bits.zh
if IsByRef(x)
w:=Min(x+w,zx+zw), x:=Max(x,zx), w-=x
, h:=Min(y+h,zy+zh), y:=Max(y,zy), h-=y
return bits
}
bch:=A_BatchLines, cri:=A_IsCritical
Critical
if (id:=this.BindWindow(0,0,1))
{
WinGet, id, ID, ahk_id %id%
WinGetPos, zx, zy, zw, zh, ahk_id %id%
}
if (!id)
{
SysGet, zx, 76
SysGet, zy, 77
SysGet, zw, 78
SysGet, zh, 79
}
bits.zx:=zx, bits.zy:=zy, bits.zw:=zw, bits.zh:=zh
, w:=Min(x+w,zx+zw), x:=Max(x,zx), w-=x
, h:=Min(y+h,zy+zh), y:=Max(y,zy), h-=y
if (zw>bits.oldzw or zh>bits.oldzh or !bits.hBM)
{
hBM:=bits.hBM
, bits.hBM:=this.CreateDIBSection(zw, zh, bpp:=32, ppvBits)
, bits.Scan0:=(!bits.hBM ? 0:ppvBits)
, bits.Stride:=((zw*bpp+31)//32)*4
, bits.oldzw:=zw, bits.oldzh:=zh
, DllCall("DeleteObject", "Ptr",hBM)
}
if (w<1 or h<1 or !bits.hBM)
{
Critical, %cri%
SetBatchLines, %bch%
return bits
}
if IsFunc(k:="GetBitsFromScreen2")
and %k%(bits, x-zx, y-zy, w, h)
{
zx:=bits.zx, zy:=bits.zy, zw:=bits.zw, zh:=bits.zh
Critical, %cri%
SetBatchLines, %bch%
return bits
}
mDC:=DllCall("CreateCompatibleDC", "Ptr",0, "Ptr")
oBM:=DllCall("SelectObject", "Ptr",mDC, "Ptr",bits.hBM, "Ptr")
if (id)
{
if (mode:=this.BindWindow(0,0,0,1))<2
{
hDC2:=DllCall("GetDCEx", "Ptr",id, "Ptr",0, "int",3, "Ptr")
DllCall("BitBlt","Ptr",mDC,"int",x-zx,"int",y-zy,"int",w,"int",h
, "Ptr",hDC2, "int",x-zx, "int",y-zy, "uint",0xCC0020|0x40000000)
DllCall("ReleaseDC", "Ptr",id, "Ptr",hDC2)
}
else
{
hBM2:=this.CreateDIBSection(zw, zh)
mDC2:=DllCall("CreateCompatibleDC", "Ptr",0, "Ptr")
oBM2:=DllCall("SelectObject", "Ptr",mDC2, "Ptr",hBM2, "Ptr")
DllCall("PrintWindow", "Ptr",id, "Ptr",mDC2, "uint",(mode>3)*3)
DllCall("BitBlt","Ptr",mDC,"int",x-zx,"int",y-zy,"int",w,"int",h
, "Ptr",mDC2, "int",x-zx, "int",y-zy, "uint",0xCC0020|0x40000000)
DllCall("SelectObject", "Ptr",mDC2, "Ptr",oBM2)
DllCall("DeleteDC", "Ptr",mDC2)
DllCall("DeleteObject", "Ptr",hBM2)
}
}
else
{
win:=DllCall("GetDesktopWindow", "Ptr")
hDC:=DllCall("GetWindowDC", "Ptr",win, "Ptr")
DllCall("BitBlt","Ptr",mDC,"int",x-zx,"int",y-zy,"int",w,"int",h
, "Ptr",hDC, "int",x, "int",y, "uint",0xCC0020|0x40000000)
DllCall("ReleaseDC", "Ptr",win, "Ptr",hDC)
}
if this.CaptureCursor(0,0,0,0,0,1)
this.CaptureCursor(mDC, zx, zy, zw, zh)
DllCall("SelectObject", "Ptr",mDC, "Ptr",oBM)
DllCall("DeleteDC", "Ptr",mDC)
Critical, %cri%
SetBatchLines, %bch%
return bits
}
CreateDIBSection(w, h, bpp:=32, ByRef ppvBits:=0, ByRef bi:="")
{
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")
return DllCall("CreateDIBSection", "Ptr",0, "Ptr",&bi
, "int",0, "Ptr*",ppvBits:=0, "Ptr",0, "int",0, "Ptr")
}
PicInfo(text)
{
local
static info:=[]
if !InStr(text,"$")
return
key:=(r:=StrLen(text))<1000 ? text
: DllCall("ntdll\RtlComputeCrc32", "uint",0
, "Ptr",&text, "uint",r*(1+!!A_IsUnicode), "uint")
if (info[key])
return info[key]
v:=text, comment:="", seterr:=e1:=e0:=0
; You Can Add Comment Text within The <>
if RegExMatch(v,"<([^>\n]*)>",r)
v:=StrReplace(v,r), comment:=Trim(r1)
; You can Add two fault-tolerant in the [], separated by commas
if RegExMatch(v,"\[([^\]\n]*)]",r)
{
v:=StrReplace(v,r), r:=StrSplit(r1, ",")
, seterr:=1, e1:=r[1], e0:=r[2]
}
color:=StrSplit(v,"$")[1], v:=Trim(SubStr(v,InStr(v,"$")+1))
mode:=InStr(color,"##") ? 5
: InStr(color,"-") ? 4 : InStr(color,"#") ? 3
: InStr(color,"**") ? 2 : InStr(color,"*") ? 1 : 0
color:=RegExReplace(color, "[*#\s]")
if (mode=5)
{
if (v~="[^\s\w/]") and FileExist(v) ; ImageSearch
{
if !(hBM:=LoadPicture(v))
return
this.GetBitmapWH(hBM, w, h)
if (w<1 or h<1)
return
hBM2:=this.CreateDIBSection(w, h, 32, Scan0)
this.CopyHBM(hBM2, 0, 0, hBM, 0, 0, w, h)
DllCall("DeleteObject", "Ptr",hBM)
if (!Scan0)
return
c1:=NumGet(Scan0+0,"uint")&0xFFFFFF
c2:=NumGet(Scan0+(w-1)*4,"uint")&0xFFFFFF
c3:=NumGet(Scan0+(w*h-w)*4,"uint")&0xFFFFFF
c4:=NumGet(Scan0+(w*h-1)*4,"uint")&0xFFFFFF
if (c1!=c2 or c1!=c3 or c1!=c4)
c1:=-1
VarSetCapacity(v, w*h*18*(1+!!A_IsUnicode)), i:=-4, n:=0
SetFormat, IntegerFast, d
Loop %h%
{
y:=A_Index-1
Loop %w%
if (c:=NumGet(Scan0+(i+=4),"uint")&0xFFFFFF)!=c1
v.=((A_Index-1)|y<<16) "/" c "/", n++
}
DllCall("DeleteObject", "Ptr",hBM2)
}
else
{
v:=Trim(StrReplace(RegExReplace(v,"\s"),",","/"),"/")
r:=StrSplit(v,"/"), n:=r.Length()//3
if (!n)
return
VarSetCapacity(v, n*18*(1+!!A_IsUnicode))
x1:=x2:=r[1], y1:=y2:=r[2]
SetFormat, IntegerFast, d
Loop % n + (i:=-2)*0
x:=r[i+=3], y:=r[i+1]
, (x<x1 && x1:=x), (x>x2 && x2:=x)
, (y<y1 && y1:=y), (y>y2 && y2:=y)
Loop % n + (i:=-2)*0
v.=(r[i+=3]-x1)|(r[i+1]-y1)<<16 . "/"
. Floor("0x" StrReplace(r[i+2],"0x"))&0xFFFFFF . "/"
w:=x2-x1+1, h:=y2-y1+1
}
len1:=n, len0:=0
}
else
{
r:=StrSplit(v,"."), w:=r[1]
, v:=this.base64tobit(r[2]), h:=StrLen(v)//w
if (w<1 or h<1 or StrLen(v)!=w*h)
return
if (mode=4)
{
r:=StrSplit(StrReplace(color,"0x"),"-")
, color:=Round("0x" r[1]), n:=Round("0x" r[2])
}
else
{
r:=StrSplit(color,"@")
, color:=r[1], n:=Round(r[2],2)+(!r[2])
, n:=Floor(512*9*255*255*(1-n)*(1-n))
}
StrReplace(v,"1","",len1), len0:=StrLen(v)-len1
}
e1:=Floor(len1*e1), e0:=Floor(len0*e0)
return info[key]:=[v, w, h, len1, len0, e1, e0
, mode, color, n, comment, seterr]
}
GetBitmapWH(hbm, ByRef w, ByRef h)
{
local
VarSetCapacity(bm, size:=(A_PtrSize=8 ? 32:24), 0)
r:=DllCall("GetObject", "Ptr",hbm, "int",size, "Ptr",&bm)
w:=NumGet(bm,4,"int"), h:=Abs(NumGet(bm,8,"int"))
return r
}
CopyHBM(hBM1, x1, y1, hBM2, x2, y2, w2, h2)
{
local
mDC1:=DllCall("CreateCompatibleDC", "Ptr",0, "Ptr")
oBM1:=DllCall("SelectObject", "Ptr",mDC1, "Ptr",hBM1, "Ptr")
mDC2:=DllCall("CreateCompatibleDC", "Ptr",0, "Ptr")
oBM2:=DllCall("SelectObject", "Ptr",mDC2, "Ptr",hBM2, "Ptr")
DllCall("BitBlt", "Ptr",mDC1
, "int",x1, "int",y1, "int",w2, "int",h2, "Ptr",mDC2
, "int",x2, "int",y2, "uint",0xCC0020)
DllCall("SelectObject", "Ptr",mDC2, "Ptr",oBM2)
DllCall("DeleteDC", "Ptr",mDC2)
DllCall("SelectObject", "Ptr",mDC1, "Ptr",oBM1)
DllCall("DeleteDC", "Ptr",mDC1)
}
CopyBits(Scan01,Stride1,x1,y1,Scan02,Stride2,x2,y2,w2,h2,Reverse:=0)
{
local
p1:=Scan01+(y1-1)*Stride1+x1*4
, p2:=Scan02+(y2-1)*Stride2+x2*4, w2*=4
if (Reverse)
p2+=(h2+1)*Stride2, Stride2:=-Stride2
Loop % h2
DllCall("RtlMoveMemory","Ptr",p1+=Stride1,"Ptr",p2+=Stride2,"Ptr",w2)
}
; Bind the window so that it can find images when obscured
; by other windows, it's equivalent to always being
; at the front desk. Unbind Window using FindText().BindWindow(0)
BindWindow(bind_id:=0, bind_mode:=0, get_id:=0, get_mode:=0)
{
local
bind:=this.bind
if (get_id)
return bind.id
if (get_mode)
return bind.mode
if (bind_id)
{
bind.id:=bind_id, bind.mode:=bind_mode, bind.oldStyle:=0
if (bind_mode & 1)
{
WinGet, oldStyle, ExStyle, ahk_id %bind_id%
bind.oldStyle:=oldStyle
WinSet, Transparent, 255, ahk_id %bind_id%
Loop 30
{
Sleep, 100
WinGet, i, Transparent, ahk_id %bind_id%
}
Until (i=255)
}
}
else
{
bind_id:=bind.id
if (bind.mode & 1)
WinSet, ExStyle, % bind.oldStyle, ahk_id %bind_id%
bind.id:=0, bind.mode:=0, bind.oldStyle:=0
}
}
; Use FindText().CaptureCursor(1) to Capture Cursor
; Use FindText().CaptureCursor(0) to Cancel Capture Cursor
CaptureCursor(hDC:=0, zx:=0, zy:=0, zw:=0, zh:=0, get_cursor:=0)
{
local
if (get_cursor)
return this.Cursor
if (hDC=1 or hDC=0) and (zw=0)
{
this.Cursor:=hDC
return
}
VarSetCapacity(mi, 40, 0), NumPut(16+A_PtrSize, mi, "int")
DllCall("GetCursorInfo", "Ptr",&mi)
bShow := NumGet(mi, 4, "int")
hCursor := NumGet(mi, 8, "Ptr")
x := NumGet(mi, 8+A_PtrSize, "int")
y := NumGet(mi, 12+A_PtrSize, "int")
if (!bShow) or (x<zx or y<zy or x>=zx+zw or y>=zy+zh)
return
VarSetCapacity(ni, 40, 0)
DllCall("GetIconInfo", "Ptr",hCursor, "Ptr",&ni)
xCenter := NumGet(ni, 4, "int")
yCenter := NumGet(ni, 8, "int")
hBMMask := NumGet(ni, (A_PtrSize=8?16:12), "Ptr")
hBMColor := NumGet(ni, (A_PtrSize=8?24:16), "Ptr")
DllCall("DrawIconEx", "Ptr",hDC
, "int",x-xCenter-zx, "int",y-yCenter-zy, "Ptr",hCursor
, "int",0, "int",0, "int",0, "int",0, "int",3)
DllCall("DeleteObject", "Ptr",hBMMask)
DllCall("DeleteObject", "Ptr",hBMColor)
}
MCode(ByRef code, hex)
{
local
SetBatchLines, % (bch:=A_BatchLines)?"-1":"-1"
VarSetCapacity(code, len:=StrLen(hex)//2)
Loop % len
NumPut("0x" SubStr(hex,2*A_Index-1,2),code,A_Index-1,"uchar")
DllCall("VirtualProtect","Ptr",&code,"Ptr",len,"uint",0x40,"Ptr*",0)
SetBatchLines, %bch%
}
base64tobit(s)
{
local
Chars:="0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZ"
. "abcdefghijklmnopqrstuvwxyz"
Loop Parse, Chars
{
s:=RegExReplace(s, "[" A_LoopField "]"
, StrReplace( ((i:=A_Index-1)>>5&1) . (i>>4&1)
. (i>>3&1) . (i>>2&1) . (i>>1&1) . (i&1), "0x"))
}
return RegExReplace(RegExReplace(s,"[^01]+"),"10*$")
}
bit2base64(s)
{
local
s:=RegExReplace(s,"[^01]+")
s.=SubStr("100000",1,6-Mod(StrLen(s),6))
s:=RegExReplace(s,".{6}","|$0")
Chars:="0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZ"
. "abcdefghijklmnopqrstuvwxyz"
Loop Parse, Chars
{
s:=StrReplace(s, StrReplace("|" . ((i:=A_Index-1)>>5&1)
. (i>>4&1) . (i>>3&1) . (i>>2&1) . (i>>1&1) . (i&1)
, "0x"), A_LoopField)
}
return s
}
xywh2xywh(x1,y1,w1,h1, ByRef x, ByRef y, ByRef w, ByRef h
, ByRef zx:="", ByRef zy:="", ByRef zw:="", ByRef zh:="")
{
SysGet, zx, 76
SysGet, zy, 77
SysGet, zw, 78
SysGet, zh, 79
w:=Min(x1+w1,zx+zw), x:=Max(x1,zx), w-=x
, h:=Min(y1+h1,zy+zh), y:=Max(y1,zy), h-=y
}
ASCII(s)
{
local
if RegExMatch(s,"\$(\d+)\.([\w+/]+)",r)
{
s:=RegExReplace(this.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 FindText().PicLib(Text,1) to add the text library to PicLib()'s Lib,
; Use FindText().PicLib("comment1|comment2|...") to get text images from Lib
PicLib(comments, add_to_Lib:=0, index:=1)
{
local
Lib:=this.Lib, (!Lib.HasKey(index) && Lib[index]:=[]), Lib:=Lib[index]
if (add_to_Lib)
{
re:="<([^>\n]*)>[^$\n]+\$\d+\.[\w+/]+"
Loop Parse, comments, |
if RegExMatch(A_LoopField,re,r)
{
s1:=Trim(r1), s2:=""
Loop Parse, s1
s2.="_" . Format("{:d}",Ord(A_LoopField))
Lib[s2]:=r
}
Lib[""]:=""
}
else
{
Text:=""
Loop Parse, comments, |
{
s1:=Trim(A_LoopField), s2:=""
Loop Parse, s1
s2.="_" . Format("{:d}",Ord(A_LoopField))
Text.="|" . Lib[s2]
}
return Text
}
}
; Decompose a string into individual characters and get their data
PicN(Number, index:=1)
{
return this.PicLib(RegExReplace(Number,".","|$0"), 0, index)
}
; Use FindText().PicX(Text) to automatically cut into multiple characters
; Can't be used in ColorPos mode, because it can cause position errors
PicX(Text)
{
local
if !RegExMatch(Text,"(<[^$\n]+)\$(\d+)\.([\w+/]+)",r)
return Text
v:=this.base64tobit(r3), Text:=""
c:=StrLen(StrReplace(v,"0"))<=StrLen(v)//2 ? "1":"0"
txt:=RegExReplace(v,".{" r2 "}","$0`n")
While InStr(txt,c)
{
While !(txt~="m`n)^" c)
txt:=RegExReplace(txt,"m`n)^.")
i:=0
While (txt~="m`n)^.{" i "}" c)
i:=Format("{:d}",i+1)
v:=RegExReplace(txt,"m`n)^(.{" i "}).*","$1")
txt:=RegExReplace(txt,"m`n)^.{" i "}")
if (v!="")
Text.="|" r1 "$" i "." this.bit2base64(v)
}
return Text
}
; Screenshot and retained as the last screenshot.
ScreenShot(x1:=0, y1:=0, x2:=0, y2:=0)
{
this.FindText("", "", x1, y1, x2, y2)
}
; Get the RGB color of a point from the last screenshot.
; If the point to get the color is beyond the range of
; Screen, it will return White color (0xFFFFFF).
GetColor(x, y, fmt:=1)
{
local
bits:=this.GetBitsFromScreen(0,0,0,0,0,zx,zy,zw,zh)
, c:=(x<zx or x>=zx+zw or y<zy or y>=zy+zh or !bits.Scan0)
? 0xFFFFFF : NumGet(bits.Scan0+(y-zy)*bits.Stride+(x-zx)*4,"uint")
return (fmt ? Format("0x{:06X}",c&0xFFFFFF) : c)
}
; Set the RGB color of a point in the last screenshot
SetColor(x, y, color:=0x000000)
{
local
bits:=this.GetBitsFromScreen(0,0,0,0,0,zx,zy,zw,zh)
if !(x<zx or x>=zx+zw or y<zy or y>=zy+zh or !bits.Scan0)
NumPut(color,bits.Scan0+(y-zy)*bits.Stride+(x-zx)*4,"uint")
}
; Identify a line of text or verification code
; based on the result returned by FindText().
; offsetX is the maximum interval between two texts,
; if it exceeds, a "*" sign will be inserted.
; offsetY is the maximum height difference between two texts.
; overlapW is used to set the width of the overlap.
; Return Association array {text:Text, x:X, y:Y, w:W, h:H}
Ocr(ok, offsetX:=20, offsetY:=20, overlapW:=0)
{
local
ocr_Text:=ocr_X:=ocr_Y:=min_X:=dx:=""
For k,v in ok
x:=v[1]
, min_X:=(A_Index=1 or x<min_X ? x : min_X)
, max_X:=(A_Index=1 or x>max_X ? x : max_X)
While (min_X!="" and min_X<=max_X)
{
LeftX:=""
For k,v in ok
{
x:=v[1], y:=v[2]
if (x<min_X) or Abs(y-ocr_Y)>offsetY
Continue
; Get the leftmost X coordinates
if (LeftX="" or x<LeftX)
LeftX:=x, LeftY:=y, LeftW:=v[3], LeftH:=v[4], LeftOCR:=v.id
}
if (LeftX="")
Break
if (ocr_X="")
ocr_X:=LeftX, min_Y:=LeftY, max_Y:=LeftY+LeftH
; If the interval exceeds the set value, add "*" to the result
ocr_Text.=(ocr_Text!="" and LeftX>dx ? "*":"") . LeftOCR
; Update for next search
min_X:=LeftX+LeftW-(overlapW>LeftW//2 ? LeftW//2:overlapW)
, dx:=LeftX+LeftW+offsetX
, ocr_Y:=LeftY, (LeftY<min_Y && min_Y:=LeftY)
, (LeftY+LeftH>max_Y && max_Y:=LeftY+LeftH)
}
return {text:ocr_Text, x:ocr_X, y:min_Y
, w: min_X-ocr_X, h: max_Y-min_Y}
}
; Sort the results returned by FindText() from left to right
; and top to bottom, ignore slight height difference
Sort(ok, dy:=10)
{
local
if !IsObject(ok)
return ok
ypos:=[]
For k,v in ok
{
x:=v.x, y:=v.y, add:=1
For k2,v2 in ypos
if Abs(y-v2)<=dy
{
y:=v2, add:=0
Break
}
if (add)
ypos.Push(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
Sort2(ok, px, py)
{
local
if !IsObject(ok)
return ok
For k,v in ok
n:=((v.x-px)**2+(v.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:="", w:=10, h:=10, d:=4)
{
local
if (x="")
{
VarSetCapacity(pt,16,0), DllCall("GetCursorPos","ptr",&pt)
x:=NumGet(pt,0,"uint"), y:=NumGet(pt,4,"uint")
}
x:=Round(x-w-d), y:=Round(y-h-d), w:=(2*w+1)+2*d, h:=(2*h+1)+2*d
;-------------------------
Gui, _MouseTip_: +AlwaysOnTop -Caption +ToolWindow +Hwndmyid -DPIScale
Gui, _MouseTip_: Show, Hide w%w% h%h%
;-------------------------
DetectHiddenWindows, % (dhw:=A_DetectHiddenWindows)?"On":"On"
i:=w-d, j:=h-d
s:="0-0 " (w "-0 ") (w "-" h) (" 0-" h) " 0-0 "
. (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
}
; Quickly get the search data of screen image
GetTextFromScreen(x1, y1, x2, y2, Threshold:=""
, ScreenShot:=1, ByRef rx:="", ByRef ry:="")
{
local
SetBatchLines, % (bch:=A_BatchLines)?"-1":"-1"
x:=Min(x1,x2), y:=Min(y1,y2), w:=Abs(x2-x1)+1, h:=Abs(y2-y1)+1
this.GetBitsFromScreen(x,y,w,h,ScreenShot,zx,zy,zw,zh)
if (w<1 or h<1)
{
SetBatchLines, %bch%
return
}
gs:=[], k:=0
Loop %h%
{
j:=y+A_Index-1
Loop %w%
i:=x+A_Index-1, c:=this.GetColor(i,j,0)
, gs[++k]:=(((c>>16)&0xFF)*38+((c>>8)&0xFF)*75+(c&0xFF)*15)>>7
}
if InStr(Threshold,"**")
{
Threshold:=StrReplace(Threshold,"*")
if (Threshold="")
Threshold:=50
s:="", sw:=w, w-=2, h-=2, x++, y++
Loop %h%
{
y1:=A_Index
Loop %w%
x1:=A_Index, i:=y1*sw+x1+1, j:=gs[i]+Threshold
, s.=( gs[i-1]>j || gs[i+1]>j
|| gs[i-sw]>j || gs[i+sw]>j
|| gs[i-sw-1]>j || gs[i-sw+1]>j
|| gs[i+sw-1]>j || gs[i+sw+1]>j ) ? "1":"0"
}
Threshold:="**" Threshold
}
else
{
Threshold:=StrReplace(Threshold,"*")
if (Threshold="")
{
pp:=[]
Loop 256
pp[A_Index-1]:=0
Loop % w*h
pp[gs[A_Index]]++
IP0:=IS0:=0
Loop 256
k:=A_Index-1, IP0+=k*pp[k], IS0+=pp[k]
Threshold:=Floor(IP0/IS0)
Loop 20
{
LastThreshold:=Threshold
IP1:=IS1:=0
Loop % LastThreshold+1
k:=A_Index-1, IP1+=k*pp[k], IS1+=pp[k]
IP2:=IP0-IP1, IS2:=IS0-IS1
if (IS1!=0 and IS2!=0)
Threshold:=Floor((IP1/IS1+IP2/IS2)/2)
if (Threshold=LastThreshold)
Break
}
}
s:=""
Loop % w*h
s.=gs[A_Index]<=Threshold ? "1":"0"
Threshold:="*" Threshold
}
;--------------------
w:=Format("{:d}",w), CutUp:=CutDown:=0
re1:="(^0{" w "}|^1{" w "})"
re2:="(0{" w "}$|1{" w "}$)"
While RegExMatch(s,re1)
s:=RegExReplace(s,re1), CutUp++
While RegExMatch(s,re2)
s:=RegExReplace(s,re2), CutDown++
rx:=x+w//2, ry:=y+CutUp+(h-CutUp-CutDown)//2
s:="|<>" Threshold "$" w "." this.bit2base64(s)
;--------------------
SetBatchLines, %bch%
return s
}
; Quickly save screen image to BMP file for debugging
SavePic(file, x1:=0, y1:=0, x2:=0, y2:=0, ScreenShot:=1)
{
local
if (x1*x1+y1*y1+x2*x2+y2*y2<=0)
n:=150000, x:=y:=-n, w:=h:=2*n
else
x:=Min(x1,x2), y:=Min(y1,y2), w:=Abs(x2-x1)+1, h:=Abs(y2-y1)+1
bits:=this.GetBitsFromScreen(x,y,w,h,ScreenShot,zx,zy,zw,zh)
if (w<1 or h<1 or !bits.hBM)
return
hBM:=this.CreateDIBSection(w, -h, bpp:=24, ppvBits, bi)
this.CopyHBM(hBM, 0, 0, bits.hBM, x-zx, y-zy, w, h)
size:=((w*bpp+31)//32)*4*h, NumPut(size, bi, 20, "uint")
VarSetCapacity(bf, 14, 0), StrPut("BM", &bf, "CP0")
NumPut(54+size, bf, 2, "uint"), NumPut(54, bf, 10, "uint")
f:=FileOpen(file,"w"), f.RawWrite(bf,14), f.RawWrite(bi,40)
, f.RawWrite(ppvBits+0, size), f.Close()
DllCall("DeleteObject", "Ptr",hBM)
}
; Show the saved Picture file
ShowPic(file:="", show:=1
, ByRef zx:="", ByRef zy:="", ByRef w:="", ByRef h:="")
{
local
Gui, FindText_Screen: Destroy
if (file="") or !FileExist(file)
return
bits:=this.GetBitsFromScreen(0,0,0,0,1,zx,zy,zw,zh)
hBM:=bits.hBM, hBM2:=LoadPicture(file)
this.GetBitmapWH(hBM2, w, h)
this.CopyHBM(hBM, 0, 0, hBM2, 0, 0, w, h)
DllCall("DeleteObject", "Ptr",hBM2)
if (!show)
return
;-------------------
mDC:=DllCall("CreateCompatibleDC", "Ptr",0, "Ptr")
oBM:=DllCall("SelectObject", "Ptr",mDC, "Ptr",hBM, "Ptr")
hBrush:=DllCall("CreateSolidBrush", "uint",0xFFFFFF, "Ptr")
oBrush:=DllCall("SelectObject", "Ptr",mDC, "Ptr",hBrush, "Ptr")
DllCall("BitBlt", "Ptr",mDC, "int",0, "int",0, "int",zw, "int",zh
, "Ptr",mDC, "int",0, "int",0, "uint",0xC000CA) ; MERGECOPY
DllCall("SelectObject", "Ptr",mDC, "Ptr",oBrush)
DllCall("DeleteObject", "Ptr",hBrush)
DllCall("SelectObject", "Ptr",mDC, "Ptr",oBM)
DllCall("DeleteDC", "Ptr",mDC)
;-------------------
Gui, FindText_Screen: +AlwaysOnTop -Caption +ToolWindow -DPIScale +E0x08000000
Gui, FindText_Screen: Margin, 0, 0
Gui, FindText_Screen: Add, Pic,, HBITMAP:*%hBM%
Gui, FindText_Screen: Show, NA x%zx% y%zy% w%zw% h%zh%, Show Pic
}
; Running AHK code dynamically with new threads
Class Thread
{
__New(args*)
{
this.pid:=this.Exec(args*)
}
__Delete()
{
Process, Close, % this.pid
}
Exec(s, Ahk:="", args:="")
{
local
Ahk:=Ahk ? Ahk:A_IsCompiled ? A_ScriptDir "\AutoHotkey.exe":A_AhkPath
s:="DllCall(""SetWindowText"",""Ptr"",A_ScriptHwnd,""Str"",""<AHK>"")`n"
. StrReplace(s,"`r"), pid:=""
Try
{
shell:=ComObjCreate("WScript.Shell")
oExec:=shell.Exec("""" Ahk """ /f * " args)
oExec.StdIn.Write(s)
oExec.StdIn.Close(), pid:=oExec.ProcessID
}
Catch
{
f:=A_Temp "\~ahk.tmp"
s:="`n FileDelete, " f "`n" s
FileDelete, %f%
FileAppend, %s%, %f%
r:=this.Clear.Bind(this)
SetTimer, %r%, -3000
Run, "%Ahk%" /f "%f%" %args%,, UseErrorLevel, pid
}
return pid
}
Clear()
{
FileDelete, % A_Temp "\~ahk.tmp"
SetTimer,, Off
}
}
; FindText().QPC() Use the same as A_TickCount
QPC()
{
static f:=0, c:=DllCall("QueryPerformanceFrequency", "Int*",f)
return (!DllCall("QueryPerformanceCounter","Int64*",c))*0+(c/f)*1000
}
WindowToScreen(ByRef x, ByRef y, x1, y1, id:="")
{
local
WinGetPos, winx, winy,,, % id ? "ahk_id " id : "A"
x:=x1+Floor(winx), y:=y1+Floor(winy)
}
ScreenToWindow(ByRef x, ByRef y, x1, y1, id:="")
{
local
this.WindowToScreen(dx,dy,0,0,id), x:=x1-dx, y:=y1-dy
}
ClientToScreen(ByRef x, ByRef y, x1, y1, id:="")
{
local
if (!id)
WinGet, id, ID, A
VarSetCapacity(pt,8,0), NumPut(0,pt,"int64")
, DllCall("ClientToScreen", "Ptr",id, "Ptr",&pt)
, x:=x1+NumGet(pt,"int"), y:=y1+NumGet(pt,4,"int")
}
ScreenToClient(ByRef x, ByRef y, x1, y1, id:="")
{
local
this.ClientToScreen(dx,dy,0,0,id), x:=x1-dx, y:=y1-dy
}
; It is not like FindText always use Screen Coordinates,
; But like built-in command ImageSearch using CoordMode Settings
ImageSearch(ByRef rx, ByRef ry, x1, y1, x2, y2, text
, ScreenShot:=1, FindAll:=0)
{
local
dx:=dy:=0
if (A_CoordModePixel="Window")
this.WindowToScreen(dx,dy,0,0)
else if (A_CoordModePixel="Client")
this.ClientToScreen(dx,dy,0,0)
if (ok:=this.FindText(x, y, x1+dx, y1+dy, x2+dx, y2+dy
, 0, 0, text, ScreenShot, FindAll))
{
rx:=x-dx, ry:=y-dy, ErrorLevel:=0
return 1
}
else
{
rx:=ry:="", ErrorLevel:=1
return 0
}
}
Click(x:="", y:="", other:="", ms:="")
{
local
bak:=A_CoordModeMouse
CoordMode, Mouse, Screen
MouseMove, x, y, 0
Click, %x%, %y%, %other%
CoordMode, Mouse, %bak%
Sleep, (ms!="" ? ms : InStr(other,"R") ? 500 : 100)
}
ToolTip(s:="", x:="", y:="", num:=1, arg:="")
{
local
static ini:=[]
f:= "ToolTip_" . Round(num)
if (s="")
{
ini.Delete(f)
Gui, %f%: Destroy
return
}
;-----------------
r1:=A_CoordModeToolTip
r2:=A_CoordModeMouse
CoordMode, Mouse, Screen
MouseGetPos, x1, y1
CoordMode, Mouse, %r1%
MouseGetPos, x2, y2
CoordMode, Mouse, %r2%
x:=Round(x="" ? x1+16 : x+x1-x2)
y:=Round(y="" ? y1+16 : y+y1-y2)
;-----------------
bgcolor:=arg.bgcolor ? arg.bgcolor : "FAFBFC"
color:=arg.color ? arg.color : "Black"
font:=arg.font ? arg.font : "Consolas"
size:=arg.size ? arg.size : "8"
bold:=arg.bold ? arg.bold : ""
;-----------------
r:=bgcolor "|" color "|" font "|" size "|" bold "|" s
if (ini[f]!=r)
{
ini[f]:=r
Gui, %f%: Destroy
Gui, %f%: +AlwaysOnTop -Caption +ToolWindow +Border
Gui, %f%: Margin, 2, 2
Gui, %f%: Color, %bgcolor%
Gui, %f%: Font, c%color% s%size% %bold%, %font%
Gui, %f%: Add, Text,, %s%
Gui, %f%: Show, Hide, %f%
}
Gui, %f%: +AlwaysOnTop
Gui, %f%: Show, NA x%x% y%y%
}
/***** C source code of machine code *****
int __attribute__((__stdcall__)) PicFind(
int mode, unsigned int c, unsigned int n, int dir
, unsigned char * Bmp, int Stride, int zw, int zh
, int sx, int sy, int sw, int sh
, char * ss, unsigned int * s1, unsigned int * s0
, char * text, int w, int h, int err1, int err0
, unsigned int * allpos, int allpos_max )
{
int ok=0, o, i, j, k, v, r, g, b, rr, gg, bb;
int x, y, x1, y1, x2, y2, len1, len0, e1, e0, max;
int r_min, r_max, g_min, g_max, b_min, b_max, x3, y3;
unsigned char * gs;
//----------------------
// MultiColor or PixelSearch or ImageSearch Mode
if (mode==5)
{
max=n; v=c*c;
for (i=0, k=0, c=0, o=0; (j=text[o++])!='\0';)
{
if (j>='0' && j<='9') c=c*10+(j-'0');
if (j=='/' || text[o]=='\0')
{
if (k=!k)
s1[i]=(c>>16)*Stride+(c&0xFFFF)*4;
else
s0[i++]=c;
c=0;
}
}
goto StartLookUp;
}
//----------------------
// Generate Lookup Table
o=0; len1=0; len0=0;
for (y=0; y<h; y++)
{
for (x=0; x<w; x++)
{
i=(mode==3) ? y*Stride+x*4 : y*sw+x;
if (text[o++]=='1')
s1[len1++]=i;
else
s0[len0++]=i;
}
}
if (err1>=len1) len1=0;
if (err0>=len0) len0=0;
max=(len1>len0) ? len1 : len0;
//----------------------
// Color Position Mode
// only used to recognize multicolored Verification Code
if (mode==3)
{ c=(c/w)*Stride+(c%w)*4; goto StartLookUp; }
//----------------------
// Generate Two Value Image
o=sy*Stride+sx*4; j=Stride-sw*4; 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; v=r+rr+rr;
ss[i]=((1024+v)*r*r+2048*g*g+(1534-v)*b*b<=n) ? 1:0;
}
}
else if (mode==1) // Gray Threshold Mode
{
c=(c+1)<<7;
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 if (mode==2) // Gray Difference Mode
{
gs=(unsigned char *)(ss+sw*sh);
x2=sx+sw; y2=sy+sh;
for (y=sy-1; y<=y2; y++)
{
for (x=sx-1; x<=x2; x++, i++)
if (x<0 || x>=zw || y<0 || y>=zh)
gs[i]=0;
else
{
o=y*Stride+x*4;
gs[i]=(Bmp[2+o]*38+Bmp[1+o]*75+Bmp[o]*15)>>7;
}
}
k=sw+2; i=0;
for (y=1; y<=sh; y++)
for (x=1; x<=sw; x++, i++)
{
o=y*k+x; n=gs[o]+c;
ss[i]=(gs[o-1]>n || gs[o+1]>n
|| gs[o-k]>n || gs[o+k]>n
|| gs[o-k-1]>n || gs[o-k+1]>n
|| gs[o+k-1]>n || gs[o+k+1]>n) ? 1:0;
}
}
else // (mode==4) Color Difference Mode
{
r=(c>>16)&0xFF; g=(c>>8)&0xFF; b=c&0xFF;
rr=(n>>16)&0xFF; gg=(n>>8)&0xFF; bb=n&0xFF;
r_min=r-rr; g_min=g-gg; b_min=b-bb;
r_max=r+rr; g_max=g+gg; b_max=b+bb;
for (y=0; y<sh; y++, o+=j)
for (x=0; x<sw; x++, o+=4, i++)
{
r=Bmp[2+o]; g=Bmp[1+o]; b=Bmp[o];
ss[i]=(r>=r_min && r<=r_max
&& g>=g_min && g<=g_max
&& b>=b_min && b<=b_max) ? 1:0;
}
}
//----------------------
StartLookUp:
if (mode==5 || mode==3)
{ x1=sx; y1=sy; x2=sx+sw-w; y2=sy+sh-h; sx=0; sy=0; }
else
{ x1=0; y1=0; x2=sw-w; y2=sh-h; }
if (dir<1 || dir>8) dir=1;
// 1 ==> Top to Bottom ( Left to Right )
// 2 ==> Top to Bottom ( Right to Left )
// 3 ==> Bottom to Top ( Left to Right )
// 4 ==> Bottom to Top ( Right to Left )
// 5 ==> Left to Right ( Top to Bottom )
// 6 ==> Left to Right ( Bottom to Top )
// 7 ==> Right to Left ( Top to Bottom )
// 8 ==> Right to Left ( Bottom to Top )
if (--dir>3) { i=y1; y1=x1; x1=i; i=y2; y2=x2; x2=i; }
for (y3=y1; y3<=y2; y3++)
{
for (x3=x1; x3<=x2; x3++)
{
y=((dir&3)>1) ? y1+y2-y3 : y3;
x=(dir&1) ? x1+x2-x3 : x3;
if (dir>3) { i=y; y=x; x=i; }
//----------------------
e1=err1; e0=err0;
if (mode==5)
{
o=y*Stride+x*4;
for (i=0; i<max; i++)
{
j=o+s1[i]; c=s0[i]; r=Bmp[2+j]-((c>>16)&0xFF);
g=Bmp[1+j]-((c>>8)&0xFF); b=Bmp[j]-(c&0xFF);
if ((r*r>v || g*g>v || b*b>v) && (--e1)<0)
goto NoMatch;
}
}
else if (mode==3)
{
o=y*Stride+x*4;
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; v=r+rr+rr;
if ((1024+v)*r*r+2048*g*g+(1534-v)*b*b>n && (--e1)<0)
goto NoMatch;
}
if (i<len0)
{
j=o+s0[i]; r=Bmp[2+j]-rr; g=Bmp[1+j]-gg; b=Bmp[j]-bb; v=r+rr+rr;
if ((1024+v)*r*r+2048*g*g+(1534-v)*b*b<=n && (--e0)<0)
goto NoMatch;
}
}
}
else
{
o=y*sw+x;
for (i=0; i<max; i++)
{
if (i<len1 && ss[o+s1[i]]==0 && (--e1)<0) goto NoMatch;
if (i<len0 && ss[o+s0[i]]!=0 && (--e0)<0) goto NoMatch;
}
// Clear the image that has been found
for (i=0; i<len1; i++)
ss[o+s1[i]]=0;
}
allpos[ok*2]=sx+x; allpos[ok*2+1]=sy+y;
if (++ok>=allpos_max) goto Return1;
NoMatch:;
}
}
//----------------------
Return1:
return ok;
}
*/
;==== Optional GUI interface ====
Gui(cmd, arg1:="")
{
local
static
local bch, cri
static init:=0
if (!init)
{
init:=1
Gui_ := this.Gui.Bind(this)
Gui_G := this.Gui.Bind(this, "G")
Gui_Run := this.Gui.Bind(this, "Run")
Gui_Off := this.Gui.Bind(this, "Off")
Gui_Show := this.Gui.Bind(this, "Show")
Gui_KeyDown := this.Gui.Bind(this, "KeyDown")
Gui_LButtonDown := this.Gui.Bind(this, "LButtonDown")
Gui_MouseMove := this.Gui.Bind(this, "MouseMove")
Gui_ScreenShot := this.Gui.Bind(this, "ScreenShot")
Gui_ShowPic := this.Gui.Bind(this, "ShowPic")
Gui_Slider := this.Gui.Bind(this, "Slider")
Gui_ToolTip := this.Gui.Bind(this, "ToolTip")
Gui_ToolTipOff := this.Gui.Bind(this, "ToolTipOff")
Gui_SaveScr := this.Gui.Bind(this, "SaveScr")
bch:=A_BatchLines, cri:=A_IsCritical
Critical
#NoEnv
%Gui_%("Load_Language_Text")
%Gui_%("MakeCaptureWindow")
%Gui_%("MakeMainWindow")
OnMessage(0x100, Gui_KeyDown)
OnMessage(0x201, Gui_LButtonDown)
OnMessage(0x200, Gui_MouseMove)
Menu, Tray, Add
Menu, Tray, Add, % Lang["s1"], %Gui_Show%
if (!A_IsCompiled and A_LineFile=A_ScriptFullPath)
{
Menu, Tray, Default, % Lang["s1"]
Menu, Tray, Click, 1
Menu, Tray, Icon, Shell32.dll, 23
}
Critical, %cri%
SetBatchLines, %bch%
}
Switch cmd
{
Case "Off":
return (KeyDown:=1)
Case "G":
GuiControl, +g, %id%, %Gui_Run%
return
Case "Run":
Critical
%Gui_%(A_GuiControl)
return
Case "Show":
Gui, FindText_Main: Default
Gui, Show, Center
GuiControl, Focus, scr
return
Case "MakeCaptureWindow":
ww:=35, hh:=12, WindowColor:="0xDDEEFF"
Gui, FindText_Capture: New
Gui, +AlwaysOnTop -DPIScale
Gui, Margin, 15, 15
Gui, Color, %WindowColor%
Gui, Font, s12, Verdana
Gui, -Theme
nW:=71, nH:=25, w:=11, C_:=[], Cid_:=[]
Loop % nW*(nH+1)
{
i:=A_Index, j:=i=1 ? "" : Mod(i,nW)=1 ? "xm y+1":"x+1"
Gui, Add, Progress, w%w% h%w% %j% Hwndid
Control, ExStyle, -0x20000,, ahk_id %id%
C_[i]:=id, Cid_[id]:=i
}
Gui, +Theme
GuiControlGet, p, Pos, %id%
w:=pX+pW-15, h:=pY+pH-15
Gui, Add, Slider, xm w%w% vMySlider1 Hwndid Disabled
+Center Page20 Line10 NoTicks AltSubmit
%Gui_G%()
Gui, Add, Slider, ym h%h% vMySlider2 Hwndid Disabled
+Center Page20 Line10 NoTicks AltSubmit +Vertical
%Gui_G%()
GuiControlGet, p, Pos, %id%
k:=pX+pW, MySlider1:=MySlider2:=dx:=dy:=0
;--------------
Gui, Add, Button, xm Hwndid Hidden Section, % Lang["Auto"]
GuiControlGet, p, Pos, %id%
w:=Round(pW*0.75), i:=Round(w*3+15+pW*0.5-w*1.5)
Gui, Add, Button, xm+%i% yp w%w% hp -Wrap vRepU Hwndid, % Lang["RepU"]
%Gui_G%()
Gui, Add, Button, x+0 wp hp -Wrap vCutU Hwndid, % Lang["CutU"]
%Gui_G%()
Gui, Add, Button, x+0 wp hp -Wrap vCutU3 Hwndid, % Lang["CutU3"]
%Gui_G%()
Gui, Add, Button, xm wp hp -Wrap vRepL Hwndid, % Lang["RepL"]
%Gui_G%()
Gui, Add, Button, x+0 wp hp -Wrap vCutL Hwndid, % Lang["CutL"]
%Gui_G%()
Gui, Add, Button, x+0 wp hp -Wrap vCutL3 Hwndid, % Lang["CutL3"]
%Gui_G%()
Gui, Add, Button, x+15 w%pW% hp -Wrap vAuto Hwndid, % Lang["Auto"]
%Gui_G%()
Gui, Add, Button, x+15 w%w% hp -Wrap vRepR Hwndid, % Lang["RepR"]
%Gui_G%()
Gui, Add, Button, x+0 wp hp -Wrap vCutR Hwndid, % Lang["CutR"]
%Gui_G%()
Gui, Add, Button, x+0 wp hp -Wrap vCutR3 Hwndid, % Lang["CutR3"]
%Gui_G%()
Gui, Add, Button, xm+%i% wp hp -Wrap vRepD Hwndid, % Lang["RepD"]
%Gui_G%()
Gui, Add, Button, x+0 wp hp -Wrap vCutD Hwndid, % Lang["CutD"]
%Gui_G%()
Gui, Add, Button, x+0 wp hp -Wrap vCutD3 Hwndid, % Lang["CutD3"]
%Gui_G%()
;--------------
Gui, Add, Text, x+80 ys+3 Section, % Lang["SelGray"]
Gui, Add, Edit, x+3 yp-3 w60 vSelGray ReadOnly
Gui, Add, Text, x+15 ys, % Lang["SelColor"]
Gui, Add, Edit, x+3 yp-3 w120 vSelColor ReadOnly
Gui, Add, Text, x+15 ys, % Lang["SelR"]
Gui, Add, Edit, x+3 yp-3 w60 vSelR ReadOnly
Gui, Add, Text, x+5 ys, % Lang["SelG"]
Gui, Add, Edit, x+3 yp-3 w60 vSelG ReadOnly
Gui, Add, Text, x+5 ys, % Lang["SelB"]
Gui, Add, Edit, x+3 yp-3 w60 vSelB ReadOnly
;--------------
x:=w*6+pW+15*4
Gui, Add, Tab3, x%x% y+15 -Wrap, % Lang["s2"]
Gui, Tab, 1
Gui, Add, Text, x+15 y+15, % Lang["Threshold"]
Gui, Add, Edit, x+15 w100 vThreshold
Gui, Add, Button, x+15 yp-3 vGray2Two Hwndid, % Lang["Gray2Two"]
%Gui_G%()
Gui, Tab, 2
Gui, Add, Text, x+15 y+15, % Lang["GrayDiff"]
Gui, Add, Edit, x+15 w100 vGrayDiff, 50
Gui, Add, Button, x+15 yp-3 vGrayDiff2Two Hwndid, % Lang["GrayDiff2Two"]
%Gui_G%()
Gui, Tab, 3
Gui, Add, Text, x+15 y+15, % Lang["Similar1"] " 0"
Gui, Add, Slider, x+0 w120 vSimilar1 Hwndid
+Center Page1 NoTicks ToolTip, 100
%Gui_G%()
Gui, Add, Text, x+0, 100
Gui, Add, Button, x+15 yp-3 vColor2Two Hwndid, % Lang["Color2Two"]
%Gui_G%()
Gui, Tab, 4
Gui, Add, Text, x+15 y+15, % Lang["Similar2"] " 0"
Gui, Add, Slider, x+0 w120 vSimilar2 Hwndid
+Center Page1 NoTicks ToolTip, 100
%Gui_G%()
Gui, Add, Text, x+0, 100
Gui, Add, Button, x+15 yp-3 vColorPos2Two Hwndid, % Lang["ColorPos2Two"]
%Gui_G%()
Gui, Tab, 5
Gui, Add, Text, x+10 y+15, % Lang["DiffR"]
Gui, Add, Edit, x+5 w80 vDiffR Limit3
Gui, Add, UpDown, vdR Range0-255 Wrap
Gui, Add, Text, x+5, % Lang["DiffG"]
Gui, Add, Edit, x+5 w80 vDiffG Limit3
Gui, Add, UpDown, vdG Range0-255 Wrap
Gui, Add, Text, x+5, % Lang["DiffB"]
Gui, Add, Edit, x+5 w80 vDiffB Limit3
Gui, Add, UpDown, vdB Range0-255 Wrap
Gui, Add, Button, x+15 yp-3 vColorDiff2Two Hwndid, % Lang["ColorDiff2Two"]
%Gui_G%()
Gui, Tab, 6
Gui, Add, Text, x+10 y+15, % Lang["DiffRGB"]
Gui, Add, Edit, x+5 w80 vDiffRGB Limit3
Gui, Add, UpDown, vdRGB Range0-255 Wrap
Gui, Add, Checkbox, x+15 yp+5 vMultiColor Hwndid, % Lang["MultiColor"]
%Gui_G%()
Gui, Add, Button, x+15 yp-5 vUndo Hwndid, % Lang["Undo"]
%Gui_G%()
Gui, Tab
;--------------
Gui, Add, Button, xm vReset Hwndid, % Lang["Reset"]
%Gui_G%()
Gui, Add, Checkbox, x+15 yp+5 vModify Hwndid, % Lang["Modify"]
%Gui_G%()
Gui, Add, Text, x+30, % Lang["Comment"]
Gui, Add, Edit, x+5 yp-2 w150 vComment
Gui, Add, Button, x+30 yp-3 vSplitAdd Hwndid, % Lang["SplitAdd"]
%Gui_G%()
Gui, Add, Button, x+10 vAllAdd Hwndid, % Lang["AllAdd"]
%Gui_G%()
Gui, Add, Button, x+10 wp vOK Hwndid, % Lang["OK"]
%Gui_G%()
Gui, Add, Button, x+10 wp vCancel gCancel, % Lang["Cancel"]
Gui, Add, Button, xm vBind0 Hwndid, % Lang["Bind0"]
%Gui_G%()
Gui, Add, Button, x+10 vBind1 Hwndid, % Lang["Bind1"]
%Gui_G%()
Gui, Add, Button, x+10 vBind2 Hwndid, % Lang["Bind2"]
%Gui_G%()
Gui, Add, Button, x+10 vBind3 Hwndid, % Lang["Bind3"]
%Gui_G%()
Gui, Add, Button, x+10 vBind4 Hwndid, % Lang["Bind4"]
%Gui_G%()
Gui, Add, Button, x+30 vSave Hwndid, % Lang["Save"]
%Gui_G%()
Gui, Show, Hide, % Lang["s3"]
return
Case "MakeMainWindow":
Gui, FindText_Main: New
Gui, +AlwaysOnTop -DPIScale
Gui, Margin, 15, 10
Gui, Color, %WindowColor%
Gui, Font, s12, Verdana
Gui, Add, Text, xm, % Lang["NowHotkey"]
Gui, Add, Edit, x+5 w200 vNowHotkey ReadOnly
Gui, Add, Hotkey, x+5 w200 vSetHotkey1
Gui, Add, DDL, x+5 w180 vSetHotkey2
, % "||F1|F2|F3|F4|F5|F6|F7|F8|F9|F10|F11|F12|LWin|MButton"
. "|ScrollLock|CapsLock|Ins|Esc|BS|Del|Tab|Home|End|PgUp|PgDn"
. "|NumpadDot|NumpadSub|NumpadAdd|NumpadDiv|NumpadMult"
Gui, Add, GroupBox, xm y+0 w280 h55 vMyGroup cBlack
Gui, Add, Text, xp+15 yp+20 Section, % Lang["Myww"] ": "
Gui, Add, Text, x+0 w60, %ww%
Gui, Add, UpDown, vMyww Range1-100, %ww%
Gui, Add, Text, x+15 ys, % Lang["Myhh"] ": "
Gui, Add, Text, x+0 w60, %hh%
Gui, Add, UpDown, vMyhh Hwndid Range1-100, %hh%
GuiControlGet, p, Pos, %id%
GuiControl, Move, MyGroup, % "w" (pX+pW) " h" (pH+30)
x:=pX+pW+15*2
Gui, Add, Button, x%x% ys-8 w150 vApply Hwndid, % Lang["Apply"]
%Gui_G%()
Gui, Add, Checkbox, x+30 ys vAddFunc, % Lang["AddFunc"] " FindText()"
Gui, Add, Button, xm y+18 w144 vCutL2 Hwndid, % Lang["CutL2"]
%Gui_G%()
Gui, Add, Button, x+0 wp vCutR2 Hwndid, % Lang["CutR2"]
%Gui_G%()
Gui, Add, Button, x+0 wp vCutU2 Hwndid, % Lang["CutU2"]
%Gui_G%()
Gui, Add, Button, x+0 wp vCutD2 Hwndid, % Lang["CutD2"]
%Gui_G%()
Gui, Add, Button, x+0 wp vUpdate Hwndid, % Lang["Update"]
%Gui_G%()
Gui, Font, s6 bold, Verdana
Gui, Add, Edit, xm y+10 w720 r20 vMyPic -Wrap
Gui, Font, s12 norm, Verdana
Gui, Add, Button, xm w240 vCapture Hwndid, % Lang["Capture"]
%Gui_G%()
Gui, Add, Button, x+0 wp vTest Hwndid, % Lang["Test"]
%Gui_G%()
Gui, Add, Button, x+0 wp vCopy Hwndid, % Lang["Copy"]
%Gui_G%()
Gui, Add, Button, xm y+0 wp vCaptureS Hwndid, % Lang["CaptureS"]
%Gui_G%()
Gui, Add, Button, x+0 wp vGetRange Hwndid, % Lang["GetRange"]
%Gui_G%()
Gui, Add, Button, x+0 wp vGetOffset Hwndid, % Lang["GetOffset"]
%Gui_G%()
Gui, Add, Edit, xm y+10 w180 hp vClipText
Gui, Add, Button, x+0 vPaste Hwndid, % " " Lang["Paste"] " "
%Gui_G%()
Gui, Add, Button, x+0 vTestClip Hwndid, % " " Lang["TestClip"] " "
%Gui_G%()
Gui, Add, Button, x+0 vGetClipOffset Hwndid, % " " Lang["GetClipOffset"] " "
%Gui_G%()
Gui, Add, Edit, x+0 hp w150 hp vOffset Hwndid
GuiControlGet, p, Pos, %id%
w:=720+15-(pX+pW)
Gui, Add, Button, x+0 w%w% hp vCopyOffset Hwndid, % Lang["CopyOffset"]
%Gui_G%()
Gui, Font, s12 cBlue, Verdana
Gui, Add, Edit, xm w720 h300 vscr Hwndhscr -Wrap HScroll
Gui, Show, Hide, % Lang["s4"]
%Gui_%("LoadScr")
OnExit(Gui_SaveScr)
return
Case "LoadScr":
f:=A_Temp "\~scr1.tmp"
FileRead, s, %f%
GuiControl, FindText_Main:, scr, %s%
return
Case "SaveScr":
f:=A_Temp "\~scr1.tmp"
GuiControlGet, s, FindText_Main:, scr
FileDelete, %f%
FileAppend, %s%, %f%
return
Case "Capture","CaptureS":
Gui, FindText_Main: +Hwndid
if (show_gui:=(WinExist()=id))
{
WinMinimize
Gui, FindText_Main: Hide
}
ShowScreenShot:=InStr(cmd,"CaptureS")
if (ShowScreenShot)
{
this.ScreenShot(), f:=%Gui_%("SelectPic")
if (f="") or !FileExist(f)
{
if (show_gui)
{
Gui, FindText_Main: Show
GuiControl, FindText_Main: Focus, scr
}
Exit
}
this.ShowPic(f)
}
;----------------------
if GetKeyState("RButton")
Send {RButton Up}
if GetKeyState("Ctrl")
Send {Ctrl Up}
KeyDown:=0, State:=%Gui_%("State")
Gui, FindText_HotkeyIf: New, -Caption +ToolWindow +E0x80000
Gui, Show, NA x0 y0 w0 h0, FindText_HotkeyIf
Hotkey, IfWinExist, FindText_HotkeyIf
Hotkey, *RButton, %Gui_Off%, On UseErrorLevel
CoordMode, Mouse
w:=ww, h:=hh, oldx:=oldy:="", r:=StrSplit(Lang["s5"],"|")
if (!show_gui)
w:=20, h:=8
Critical, Off
Loop
{
Sleep, 50
MouseGetPos, x, y, Bind_ID
if (!show_gui)
{
w:=x<=1 ? w-1 : x>=A_ScreenWidth-2 ? w+1:w
h:=y<=1 ? h-1 : y>=A_ScreenHeight-2 ? h+1:h
w:=(w<1 ? 1:w), h:=(h<1 ? 1:h)
}
%Gui_%("Mini_Show")
if (oldx=x and oldy=y)
Continue
oldx:=x, oldy:=y
ToolTip, % r[1] " : " x "," y "`n" r[2]
}
Until (KeyDown=1) or (State!=%Gui_%("State"))
timeout:=A_TickCount+3000
While (A_TickCount<timeout) and (State!=%Gui_%("State"))
Sleep, 50
KeyDown:=0
px:=x, py:=y, oldx:=oldy:=""
Loop
{
Sleep, 50
%Gui_%("Mini_Show")
MouseGetPos, x1, y1
if (oldx=x1 and oldy=y1)
Continue
oldx:=x1, oldy:=y1
ToolTip, % r[1] " : " x "," y "`n" r[2]
}
Until (KeyDown=1) or (State!=%Gui_%("State"))
timeout:=A_TickCount+3000
While (A_TickCount<timeout) and (State!=%Gui_%("State"))
Sleep, 50
ToolTip
Critical
%Gui_%("Mini_Hide")
Hotkey, *RButton, %Gui_Off%, Off UseErrorLevel
Hotkey, IfWinExist
Gui, FindText_HotkeyIf: Destroy
if (ShowScreenShot)
this.ShowPic()
if (!show_gui)
return [px-w, py-h, px+w, py+h]
;-----------------------
%Gui_%("getcors", !ShowScreenShot)
%Gui_%("Reset")
Gui, FindText_Capture: Default
Loop 71
SendMessage, 0x2001, 0, 0xAAFFFF
,, % "ahk_id " C_[71*25+A_Index]
Loop 6
GuiControl,, Edit%A_Index%
GuiControl,, Modify, % Modify:=0
GuiControl,, MultiColor, % MultiColor:=0
GuiControl,, GrayDiff, 50
GuiControl, Focus, Gray2Two
GuiControl, +Default, Gray2Two
Gui, Show, Center
Event:=Result:=""
DetectHiddenWindows, Off
Critical, Off
Gui, +LastFound
WinWaitClose, % "ahk_id " WinExist()
Critical
ToolTip
Gui, FindText_Main: Default
;--------------------------------
if (cors.bind!="")
{
WinGetTitle, tt, ahk_id %Bind_ID%
WinGetClass, tc, ahk_id %Bind_ID%
tt:=Trim(SubStr(tt,1,30) (tc ? " ahk_class " tc:""))
tt:=StrReplace(RegExReplace(tt,"[;``]","``$0"),"""","""""")
Result:="`nSetTitleMatchMode, 2`nid:=WinExist(""" tt """)"
. "`nFindText().BindWindow(id" (cors.bind=0 ? "":"," cors.bind)
. ") `; " Lang["s6"] " this.BindWindow(0)`n`n" Result
}
if (Event="OK")
{
if (!A_IsCompiled)
{
FileRead, s, %A_LineFile%
s:=SubStr(s, s~="i)\n[;=]+ Copy The")
}
else s:=""
GuiControl,, scr, % Result "`n" s
if !InStr(Result,"##")
GuiControl,, MyPic, % Trim(this.ASCII(Result),"`n")
Result:=s:=""
}
else if (Event="SplitAdd") or (Event="AllAdd")
{
GuiControlGet, s,, scr
i:=j:=0, r:="<[^>\n]*>[^$\n]+\$[\w+/,.\-]+"
While j:=RegExMatch(s,r,"",j+1)
i:=InStr(s,"`n",0,j)
GuiControl,, scr, % SubStr(s,1,i) . Result . SubStr(s,i+1)
if !InStr(Result,"##")
GuiControl,, MyPic, % Trim(this.ASCII(Result),"`n")
Result:=s:=""
}
;----------------------
Gui, Show
GuiControl, Focus, scr
return
Case "State":
return GetKeyState((arg1?"LButton":"RButton"),"P")
. "|" GetKeyState((arg1?"LButton":"RButton"))
. "|" GetKeyState("Ctrl","P")
. "|" GetKeyState("Ctrl")
Case "SelectPic":
Gui, FindText_SelectPic: +LastFoundExist
IfWinExist
return
Pics:=[], Names:=[], s:=""
Loop Files, % A_Temp "\Ahk_ScreenShot\*.bmp"
Pics.Push(LoadPicture(v:=A_LoopFileFullPath))
, Names.Push(v), s.="|" RegExReplace(v,"i)^.*\\|\.bmp$")
Gui, FindText_SelectPic: New
Gui, +LastFound +AlwaysOnTop -DPIScale
Gui, Margin, 15, 15
Gui, Font, s12, Verdana
Gui, Add, Pic, HwndhPic w800 h500 +Border
Gui, Add, ListBox, % "x+15 w120 hp vSelectBox Hwndid"
. " AltSubmit 0x100 Choose1", % Trim(s,"|")
%Gui_G%()
Gui, Add, Button, xm w170 vOK2 Hwndid Default, % Lang["OK2"]
%Gui_G%()
Gui, Add, Button, x+15 wp vCancel2 gCancel, % Lang["Cancel2"]
Gui, Add, Button, x+15 wp vClearAll Hwndid, % Lang["ClearAll"]
%Gui_G%()
Gui, Add, Button, x+15 wp vOpenDir Hwndid, % Lang["OpenDir"]
%Gui_G%()
Gui, Add, Button, x+15 wp vSavePic Hwndid, % Lang["SavePic"]
%Gui_G%()
GuiControl, Focus, SelectBox
%Gui_%("SelectBox")
Gui, Show,, Select ScreenShot
;-----------------------
DetectHiddenWindows, Off
Critical, Off
file:=""
WinWaitClose, % "ahk_id " WinExist()
Critical
Gui, Destroy
Loop % Pics.Length()
DllCall("DeleteObject", "Ptr",Pics[A_Index])
Pics:="", Names:=""
return file
Case "SavePic":
GuiControlGet, SelectBox
f:=Names[SelectBox]
Gui, Destroy
Loop % Pics.Length()
DllCall("DeleteObject", "Ptr",Pics[A_Index])
Pics:="", Names:="", show_gui_bak:=show_gui
this.ShowPic(f)
Gui, FindText_Screen: +OwnDialogs
Loop
{
pos:=%Gui_%("GetRange")
MsgBox, 4100, Tip, % Lang["s15"] " !"
IfMsgBox, Yes
Break
}
%Gui_%("ScreenShot", pos[1] "|" pos[2] "|" pos[3] "|" pos[4] "|0")
this.ShowPic()
if (show_gui_bak)
{
GuiControl, FindText_Main: Focus, scr
Gui, FindText_Main: Show
}
Exit
Case "SelectBox":
GuiControlGet, SelectBox
if (hBM:=Pics[SelectBox])
{
this.GetBitmapWH(hBM, w, h)
GuiControl,, %hPic%, % "*W" (w<800?0:800)
. " *H" (h<500?0:500) " HBITMAP:*" hBM
}
return
Case "OK2":
GuiControlGet, SelectBox
file:=Names[SelectBox]
Gui, Hide
return
Case "ClearAll":
FileDelete, % A_Temp "\Ahk_ScreenShot\*.bmp"
Gui, Hide
return
Case "OpenDir":
Run, % A_Temp "\Ahk_ScreenShot\"
return
Case "Mini_Show":
Gui, FindText_Mini_4: +LastFoundExist
IfWinNotExist
{
Loop 4
{
i:=A_Index
Gui, FindText_Mini_%i%: +AlwaysOnTop -Caption +ToolWindow -DPIScale +E0x08000000
Gui, FindText_Mini_%i%: Show, Hide, Mini
}
}
d:=2, w:=w<0 ? 0:w, h:=h<0 ? 0:h, c:=A_MSec<500 ? "Red":"Blue"
Loop 4
{
i:=A_Index
x1:=Floor(i=3 ? x+w+1 : x-w-d)
y1:=Floor(i=4 ? y+h+1 : y-h-d)
w1:=Floor(i=1 or i=3 ? d : 2*(w+d)+1)
h1:=Floor(i=2 or i=4 ? d : 2*(h+d)+1)
Gui, FindText_Mini_%i%: Color, %c%
Gui, FindText_Mini_%i%: Show, NA x%x1% y%y1% w%w1% h%h1%
}
return
Case "Mini_Hide":
Gui, FindText_Mini_4: +Hwndid
Loop 4
Gui, FindText_Mini_%A_Index%: Destroy
WinWaitClose, ahk_id %id%,, 3
return
Case "getcors":
this.xywh2xywh(px-ww,py-hh,2*ww+1,2*hh+1,x,y,w,h)
if (w<1 or h<1)
return
SetBatchLines, % (bch:=A_BatchLines)?"-1":"-1"
if (arg1)
this.ScreenShot()
cors:=[], gray:=[], k:=0
Loop %nH%
{
j:=py-hh+A_Index-1, i:=px-ww
Loop %nW%
cors[++k]:=c:=this.GetColor(i++,j,0)
, gray[k]:=(((c>>16)&0xFF)*38+((c>>8)&0xFF)*75+(c&0xFF)*15)>>7
}
cors.CutLeft:=Abs(px-ww-x)
cors.CutRight:=Abs(px+ww-(x+w-1))
cors.CutUp:=Abs(py-hh-y)
cors.CutDown:=Abs(py+hh-(y+h-1))
SetBatchLines, %bch%
return
Case "GetRange":
Gui, FindText_Main: +Hwndid
if (show_gui:=(WinExist()=id))
Gui, FindText_Main: Hide
;---------------------
Gui, FindText_GetRange: New
Gui, +LastFound +AlWaysOnTop +ToolWindow -Caption -DPIScale +E0x08000000
Gui, Color, White
WinSet, Transparent, 10
this.xywh2xywh(0,0,0,0,0,0,0,0,x,y,w,h)
Gui, Show, NA x%x% y%y% w%w% h%h%, GetRange
;---------------------
if GetKeyState("LButton")
Send {LButton Up}
if GetKeyState("Ctrl")
Send {Ctrl Up}
KeyDown:=0, State:=%Gui_%("State",1)
Gui, FindText_HotkeyIf: New, -Caption +ToolWindow +E0x80000
Gui, Show, NA x0 y0 w0 h0, FindText_HotkeyIf
Hotkey, IfWinExist, FindText_HotkeyIf
Hotkey, *LButton, %Gui_Off%, On UseErrorLevel
Hotkey, *LButton Up, %Gui_Off%, On UseErrorLevel
CoordMode, Mouse
oldx:=oldy:="", r:=Lang["s7"]
Critical, Off
Loop
{
Sleep, 50
MouseGetPos, x, y
if (oldx=x and oldy=y)
Continue
oldx:=x, oldy:=y
ToolTip, %r%
}
Until (KeyDown=1) or (State!=%Gui_%("State",1))
KeyDown--
px:=x, py:=y, oldx:=oldy:=""
Loop
{
Sleep, 50
MouseGetPos, x, y
w:=Abs(px-x)//2, h:=Abs(py-y)//2, x:=(px+x)//2, y:=(py+y)//2
%Gui_%("Mini_Show")
if (oldx=x and oldy=y)
Continue
oldx:=x, oldy:=y
ToolTip, %r%
}
Until (KeyDown=1) or (KeyDown<0 and State=%Gui_%("State",1))
timeout:=A_TickCount+3000
While (A_TickCount<timeout) and (State!=%Gui_%("State",1))
Sleep, 50
ToolTip
Critical
%Gui_%("Mini_Hide")
Hotkey, *LButton, %Gui_Off%, Off UseErrorLevel
Hotkey, *LButton Up, %Gui_Off%, Off UseErrorLevel
Hotkey, IfWinExist
Gui, FindText_HotkeyIf: Destroy
Gui, FindText_GetRange: Destroy
Clipboard:=p:=(x-w) ", " (y-h) ", " (x+w) ", " (y+h)
if (!show_gui)
return StrSplit(p, ",", " ")
;---------------------
Gui, FindText_Main: Default
GuiControlGet, s,, scr
re:="i)(FindText\(\s*X\d*\s*,\s*Y\d*\s*,)([\d\s+\-]*,){4}"
if RegExMatch(s, re, r)
{
s:=StrReplace(s, r, r1 " " p ",", 0, 1)
GuiControl,, scr, %s%
}
Gui, Show
return
Case "Test","TestClip":
Gui, FindText_Main: Default
Gui, +LastFound
WinMinimize
Gui, Hide
DetectHiddenWindows, Off
WinWaitClose, % "ahk_id " WinExist()
Sleep, 100
;----------------------
if (cmd="Test")
GuiControlGet, s,, scr
else
GuiControlGet, s,, ClipText
if (!A_IsCompiled) and InStr(s,"MCode(") and (cmd="Test")
{
s:="`n#NoEnv`nMenu, Tray, Click, 1`n" s "`nExitApp`n"
Thread:= new this.Thread(s)
DetectHiddenWindows, On
WinWait, % "ahk_class AutoHotkey ahk_pid " Thread.pid,, 3
if (!ErrorLevel)
WinWaitClose,,, 30
Thread:="" ; kill the Thread
}
else
{
Gui, +OwnDialogs
t:=A_TickCount, n:=150000, X:=Y:=""
, RegExMatch(s,"<[^>\n]*>[^$\n]+\$[\w+/,.\-]+",r)
, v:=this.FindText(X,Y,-n, -n, n, n, 0, 0, r)
r:=StrSplit(Lang["s8"],"|")
MsgBox, 4096, Tip, % r[1] ":`t" Round(v.Length()) "`n`n"
. r[2] ":`t" (A_TickCount-t) " " r[3] "`n`n"
. r[4] ":`t" X ", " Y "`n`n"
. r[5] ":`t<" (Comment:=v[1].id) ">", 3
for i,j in v
if (i<=2)
this.MouseTip(j.x, j.y)
v:="", Clipboard:=X "," Y
}
;----------------------
Gui, Show
GuiControl, Focus, scr
return
Case "GetOffset","GetClipOffset":
Gui, FindText_Main: Hide
Gui, FindText_Capture: +LastFound
%Gui_%("Capture")
Gui, FindText_Main: Default
if (cmd="GetOffset")
GuiControlGet, s,, scr
else
GuiControlGet, s,, ClipText
RegExMatch(s, "<[^>\n]*>[^$\n]+\$[\w+/,.\-]+", r)
n:=150000, v:=this.FindText(X, Y, -n, -n, n, n, 0, 0, r)
r:=StrReplace("X+" (px-X) ", Y+" (py-Y), "+-", "-")
if (cmd="GetOffset")
{
s:=RegExReplace(s, "i)(\.Click\()[^,\n""]*,[^,)\n]*"
, "$1" r, 0, 1)
GuiControl,, scr, %s%
}
else
GuiControl,, Offset, % v ? r:""
Gui, Show
GuiControl, Focus, scr
s:=v:=""
return
Case "Paste":
if RegExMatch(Clipboard, "\|?<[^>\n]*>[^$\n]+\$[\w+/,.\-]+", r)
{
GuiControl,, ClipText, %r%
GuiControl,, MyPic, % Trim(this.ASCII(r),"`n")
}
return
Case "CopyOffset":
GuiControlGet, s,, Offset
Clipboard:=s
return
Case "Copy":
Gui, FindText_Main: Default
ControlGet, s, Selected,,, ahk_id %hscr%
if (s="")
{
GuiControlGet, s,, scr
GuiControlGet, r,, AddFunc
if (r != 1)
s:=RegExReplace(s,"\n\K[\s;=]+ Copy The[\s\S]*")
}
Clipboard:=RegExReplace(s,"\R","`r`n")
GuiControl, Focus, scr
return
Case "Apply":
Gui, FindText_Main: Default
GuiControlGet, NowHotkey
GuiControlGet, SetHotkey1
GuiControlGet, SetHotkey2
if (NowHotkey!="")
Hotkey, *%NowHotkey%,, Off UseErrorLevel
k:=SetHotkey1!="" ? SetHotkey1 : SetHotkey2
if (k!="")
Hotkey, *%k%, %Gui_ScreenShot%, On UseErrorLevel
GuiControl,, NowHotkey, %k%
GuiControl,, SetHotkey1
GuiControl, Choose, SetHotkey2, 0
;------------------------
GuiControlGet, Myww
GuiControlGet, Myhh
if (Myww!=ww or Myhh!=hh)
{
nW:=71, dx:=dy:=0
Loop % 71*25
k:=A_Index, c:=WindowColor, %Gui_%("SetColor")
ww:=Myww, hh:=Myhh, nW:=2*ww+1, nH:=2*hh+1
i:=nW>71, j:=nH>25
Gui, FindText_Capture: Default
GuiControl, Enable%i%, MySlider1
GuiControl, Enable%j%, MySlider2
GuiControl,, MySlider1, % MySlider1:=0
GuiControl,, MySlider2, % MySlider2:=0
}
return
Case "ScreenShot":
Critical
f:=A_Temp "\Ahk_ScreenShot"
if !InStr(r:=FileExist(f), "D")
{
if (r)
{
FileSetAttrib, -R, %f%
FileDelete, %f%
}
FileCreateDir, %f%
}
Loop
f:=A_Temp "\Ahk_ScreenShot\" Format("{:03d}",A_Index) ".bmp"
Until !FileExist(f)
this.SavePic(f, StrSplit(arg1,"|")*)
Gui, FindText_Tip: New
; WS_EX_NOACTIVATE:=0x08000000, WS_EX_TRANSPARENT:=0x20
Gui, +LastFound +AlwaysOnTop +ToolWindow -Caption -DPIScale +E0x08000020
Gui, Color, Yellow
Gui, Font, cRed s48 bold
Gui, Add, Text,, % Lang["s9"]
WinSet, Transparent, 200
Gui, Show, NA y0, ScreenShot Tip
Sleep, 100
Gui, Destroy
return
Case "Bind0","Bind1","Bind2","Bind3","Bind4":
this.BindWindow(Bind_ID, bind_mode:=SubStr(cmd,5))
if GetKeyState("RButton")
Send {RButton Up}
if GetKeyState("Ctrl")
Send {Ctrl Up}
KeyDown:=0, State:=%Gui_%("State")
Gui, FindText_HotkeyIf: New, -Caption +ToolWindow +E0x80000
Gui, Show, NA x0 y0 w0 h0, FindText_HotkeyIf
Hotkey, IfWinExist, FindText_HotkeyIf
Hotkey, *RButton, %Gui_Off%, On UseErrorLevel
CoordMode, Mouse
oldx:=oldy:=""
Critical, Off
Loop
{
Sleep, 50
MouseGetPos, x, y
if (oldx=x and oldy=y)
Continue
oldx:=x, oldy:=y
;---------------
px:=x, py:=y, %Gui_%("getcors",1)
%Gui_%("Reset"), r:=StrSplit(Lang["s10"],"|")
ToolTip, % r[1] " : " x "," y "`n" r[2]
}
Until (KeyDown=1) or (State!=%Gui_%("State"))
timeout:=A_TickCount+3000
While (A_TickCount<timeout) and (State!=%Gui_%("State"))
Sleep, 50
ToolTip
Critical
Hotkey, *RButton, %Gui_Off%, Off UseErrorLevel
Hotkey, IfWinExist
Gui, FindText_HotkeyIf: Destroy
this.BindWindow(0), cors.bind:=bind_mode
return
Case "MySlider1","MySlider2":
SetTimer, %Gui_Slider%, -10
return
Case "Slider":
Critical
dx:=nW>71 ? Round((nW-71)*MySlider1/100) : 0
dy:=nH>25 ? Round((nH-25)*MySlider2/100) : 0
if (oldx=dx and oldy=dy)
return
oldy:=dy, k:=0
Loop % nW*nH
c:=(!show[++k] ? WindowColor
: bg="" ? cors[k] : ascii[k]
? "Black":"White"), %Gui_%("SetColor")
Loop % nW*(oldx!=dx)
{
i:=A_Index-dx
if (i>=1 && i<=71)
{
c:=show[nW*nH+A_Index] ? 0x0000FF : 0xAAFFFF
SendMessage, 0x2001, 0, c,, % "ahk_id " C_[71*25+i]
}
}
oldx:=dx
return
Case "Reset":
show:=[], ascii:=[], bg:=""
CutLeft:=CutRight:=CutUp:=CutDown:=k:=0
Loop % nW*nH
show[++k]:=1, c:=cors[k], %Gui_%("SetColor")
Loop % cors.CutLeft
%Gui_%("CutL")
Loop % cors.CutRight
%Gui_%("CutR")
Loop % cors.CutUp
%Gui_%("CutU")
Loop % cors.CutDown
%Gui_%("CutD")
return
Case "SetColor":
if (nW=71 && nH=25)
tk:=k
else
{
tx:=Mod(k-1,nW)-dx, ty:=(k-1)//nW-dy
if (tx<0 || tx>=71 || ty<0 || ty>=25)
return
tk:=ty*71+tx+1
}
c:=c="Black" ? 0x000000 : c="White" ? 0xFFFFFF
: ((c&0xFF)<<16)|(c&0xFF00)|((c&0xFF0000)>>16)
SendMessage, 0x2001, 0, c,, % "ahk_id " . C_[tk]
return
Case "RepColor":
show[k]:=1, c:=(bg="" ? cors[k] : ascii[k]
? "Black":"White"), %Gui_%("SetColor")
return
Case "CutColor":
show[k]:=0, c:=WindowColor, %Gui_%("SetColor")
return
Case "RepL":
if (CutLeft<=cors.CutLeft)
or (bg!="" and InStr(color,"**")
and CutLeft=cors.CutLeft+1)
return
k:=CutLeft-nW, CutLeft--
Loop %nH%
k+=nW, (A_Index>CutUp and A_Index<nH+1-CutDown
? %Gui_%("RepColor") : "")
return
Case "CutL":
if (CutLeft+CutRight>=nW)
return
CutLeft++, k:=CutLeft-nW
Loop %nH%
k+=nW, (A_Index>CutUp and A_Index<nH+1-CutDown
? %Gui_%("CutColor") : "")
return
Case "CutL3":
Loop 3
%Gui_%("CutL")
return
Case "RepR":
if (CutRight<=cors.CutRight)
or (bg!="" and InStr(color,"**")
and CutRight=cors.CutRight+1)
return
k:=1-CutRight, CutRight--
Loop %nH%
k+=nW, (A_Index>CutUp and A_Index<nH+1-CutDown
? %Gui_%("RepColor") : "")
return
Case "CutR":
if (CutLeft+CutRight>=nW)
return
CutRight++, k:=1-CutRight
Loop %nH%
k+=nW, (A_Index>CutUp and A_Index<nH+1-CutDown
? %Gui_%("CutColor") : "")
return
Case "CutR3":
Loop 3
%Gui_%("CutR")
return
Case "RepU":
if (CutUp<=cors.CutUp)
or (bg!="" and InStr(color,"**")
and CutUp=cors.CutUp+1)
return
k:=(CutUp-1)*nW, CutUp--
Loop %nW%
k++, (A_Index>CutLeft and A_Index<nW+1-CutRight
? %Gui_%("RepColor") : "")
return
Case "CutU":
if (CutUp+CutDown>=nH)
return
CutUp++, k:=(CutUp-1)*nW
Loop %nW%
k++, (A_Index>CutLeft and A_Index<nW+1-CutRight
? %Gui_%("CutColor") : "")
return
Case "CutU3":
Loop 3
%Gui_%("CutU")
return
Case "RepD":
if (CutDown<=cors.CutDown)
or (bg!="" and InStr(color,"**")
and CutDown=cors.CutDown+1)
return
k:=(nH-CutDown)*nW, CutDown--
Loop %nW%
k++, (A_Index>CutLeft and A_Index<nW+1-CutRight
? %Gui_%("RepColor") : "")
return
Case "CutD":
if (CutUp+CutDown>=nH)
return
CutDown++, k:=(nH-CutDown)*nW
Loop %nW%
k++, (A_Index>CutLeft and A_Index<nW+1-CutRight
? %Gui_%("CutColor") : "")
return
Case "CutD3":
Loop 3
%Gui_%("CutD")
return
Case "Gray2Two":
Gui, FindText_Capture: Default
GuiControl, Focus, Threshold
GuiControlGet, Threshold
if (Threshold="")
{
pp:=[]
Loop 256
pp[A_Index-1]:=0
Loop % nW*nH
if (show[A_Index])
pp[gray[A_Index]]++
IP0:=IS0:=0
Loop 256
k:=A_Index-1, IP0+=k*pp[k], IS0+=pp[k]
Threshold:=Floor(IP0/IS0)
Loop 20
{
LastThreshold:=Threshold
IP1:=IS1:=0
Loop % LastThreshold+1
k:=A_Index-1, IP1+=k*pp[k], IS1+=pp[k]
IP2:=IP0-IP1, IS2:=IS0-IS1
if (IS1!=0 and IS2!=0)
Threshold:=Floor((IP1/IS1+IP2/IS2)/2)
if (Threshold=LastThreshold)
Break
}
GuiControl,, Threshold, %Threshold%
}
Threshold:=Round(Threshold)
color:="*" Threshold, k:=i:=0
Loop % nW*nH
{
ascii[++k]:=v:=(gray[k]<=Threshold)
if (show[k])
i:=(v?i+1:i-1), c:=(v?"Black":"White"), %Gui_%("SetColor")
}
bg:=i>0 ? "1":"0"
return
Case "GrayDiff2Two":
Gui, FindText_Capture: Default
GuiControlGet, GrayDiff
if (GrayDiff="")
{
Gui, +OwnDialogs
MsgBox, 4096, Tip, % Lang["s11"] " !", 1
return
}
if (CutLeft=cors.CutLeft)
%Gui_%("CutL")
if (CutRight=cors.CutRight)
%Gui_%("CutR")
if (CutUp=cors.CutUp)
%Gui_%("CutU")
if (CutDown=cors.CutDown)
%Gui_%("CutD")
GrayDiff:=Round(GrayDiff)
color:="**" GrayDiff, k:=i:=0
Loop % nW*nH
{
j:=gray[++k]+GrayDiff
, ascii[k]:=v:=( gray[k-1]>j or gray[k+1]>j
or gray[k-nW]>j or gray[k+nW]>j
or gray[k-nW-1]>j or gray[k-nW+1]>j
or gray[k+nW-1]>j or gray[k+nW+1]>j )
if (show[k])
i:=(v?i+1:i-1), c:=(v?"Black":"White"), %Gui_%("SetColor")
}
bg:=i>0 ? "1":"0"
return
Case "Color2Two","ColorPos2Two":
Gui, FindText_Capture: Default
GuiControlGet, c,, SelColor
if (c="")
{
Gui, +OwnDialogs
MsgBox, 4096, Tip, % Lang["s12"] " !", 1
return
}
UsePos:=(cmd="ColorPos2Two") ? 1:0
GuiControlGet, n,, Similar1
n:=Round(n/100,2), color:=c "@" n
, n:=Floor(512*9*255*255*(1-n)*(1-n)), k:=i:=0
, rr:=(c>>16)&0xFF, gg:=(c>>8)&0xFF, bb:=c&0xFF
Loop % nW*nH
{
c:=cors[++k], r:=((c>>16)&0xFF)-rr
, g:=((c>>8)&0xFF)-gg, b:=(c&0xFF)-bb, j:=r+rr+rr
, ascii[k]:=v:=((1024+j)*r*r+2048*g*g+(1534-j)*b*b<=n)
if (show[k])
i:=(v?i+1:i-1), c:=(v?"Black":"White"), %Gui_%("SetColor")
}
bg:=i>0 ? "1":"0"
return
Case "ColorDiff2Two":
Gui, FindText_Capture: Default
GuiControlGet, c,, SelColor
if (c="")
{
Gui, +OwnDialogs
MsgBox, 4096, Tip, % Lang["s12"] " !", 1
return
}
GuiControlGet, dR
GuiControlGet, dG
GuiControlGet, dB
rr:=(c>>16)&0xFF, gg:=(c>>8)&0xFF, bb:=c&0xFF
, n:=Format("{:06X}",(dR<<16)|(dG<<8)|dB)
, color:=StrReplace(c "-" n,"0x"), k:=i:=0
Loop % nW*nH
{
c:=cors[++k], r:=(c>>16)&0xFF, g:=(c>>8)&0xFF
, b:=c&0xFF, ascii[k]:=v:=(Abs(r-rr)<=dR
and Abs(g-gg)<=dG and Abs(b-bb)<=dB)
if (show[k])
i:=(v?i+1:i-1), c:=(v?"Black":"White"), %Gui_%("SetColor")
}
bg:=i>0 ? "1":"0"
return
Case "Modify":
GuiControlGet, Modify
return
Case "MultiColor":
GuiControlGet, MultiColor
Result:=""
ToolTip
return
Case "Undo":
Result:=RegExReplace(Result,",[^/]+/[^/]+/[^/]+$")
ToolTip, % Trim(Result,"/,")
return
Case "Similar1":
GuiControl,, Similar2, %Similar1%
return
Case "Similar2":
GuiControl,, Similar1, %Similar2%
return
Case "GetTxt":
txt:=""
if (bg="")
return
k:=0
Loop %nH%
{
v:=""
Loop %nW%
v.=!show[++k] ? "" : ascii[k] ? "1":"0"
txt.=v="" ? "" : v "`n"
}
return
Case "Auto":
%Gui_%("GetTxt")
if (txt="")
{
Gui, FindText_Capture: +OwnDialogs
MsgBox, 4096, Tip, % Lang["s13"] " !", 1
return
}
While InStr(txt,bg)
{
if (txt~="^" bg "+\n")
txt:=RegExReplace(txt,"^" bg "+\n"), %Gui_%("CutU")
else if !(txt~="m`n)[^\n" bg "]$")
txt:=RegExReplace(txt,"m`n)" bg "$"), %Gui_%("CutR")
else if (txt~="\n" bg "+\n$")
txt:=RegExReplace(txt,"\n\K" bg "+\n$"), %Gui_%("CutD")
else if !(txt~="m`n)^[^\n" bg "]")
txt:=RegExReplace(txt,"m`n)^" bg), %Gui_%("CutL")
else Break
}
txt:=""
return
Case "OK","SplitAdd","AllAdd":
Gui, FindText_Capture: Default
Gui, +OwnDialogs
%Gui_%("GetTxt")
if (txt="") and (!MultiColor)
{
MsgBox, 4096, Tip, % Lang["s13"] " !", 1
return
}
if InStr(color,"@") and (UsePos) and (!MultiColor)
{
r:=StrSplit(color,"@")
k:=i:=j:=0
Loop % nW*nH
{
if (!show[++k])
Continue
i++
if (k=cors.SelPos)
{
j:=i
Break
}
}
if (j=0)
{
MsgBox, 4096, Tip, % Lang["s12"] " !", 1
return
}
color:="#" (j-1) "@" r[2]
}
GuiControlGet, Comment
if (cmd="SplitAdd") and (!MultiColor)
{
if InStr(color,"#")
{
MsgBox, 4096, Tip, % Lang["s14"], 3
return
}
bg:=StrLen(StrReplace(txt,"0"))
> StrLen(StrReplace(txt,"1")) ? "1":"0"
s:="", i:=0, k:=nW*nH+1+CutLeft
Loop % w:=nW-CutLeft-CutRight
{
i++
if (!show[k++] and A_Index<w)
Continue
i:=Format("{:d}",i)
v:=RegExReplace(txt,"m`n)^(.{" i "}).*","$1")
txt:=RegExReplace(txt,"m`n)^.{" i "}"), i:=0
While InStr(v,bg)
{
if (v~="^" bg "+\n")
v:=RegExReplace(v,"^" bg "+\n")
else if !(v~="m`n)[^\n" bg "]$")
v:=RegExReplace(v,"m`n)" bg "$")
else if (v~="\n" bg "+\n$")
v:=RegExReplace(v,"\n\K" bg "+\n$")
else if !(v~="m`n)^[^\n" bg "]")
v:=RegExReplace(v,"m`n)^" bg)
else Break
}
if (v!="")
{
v:=Format("{:d}",InStr(v,"`n")-1) "." this.bit2base64(v)
s.="`nText.=""|<" SubStr(Comment,1,1) ">" color "$" v """`n"
Comment:=SubStr(Comment, 2)
}
}
Event:=cmd, Result:=s
Gui, Hide
return
}
if (!MultiColor)
txt:=Format("{:d}",InStr(txt,"`n")-1) "." this.bit2base64(txt)
else
{
GuiControlGet, dRGB
r:=StrSplit(Trim(StrReplace(Result,",","/"),"/"),"/")
, x:=r[1], y:=r[2], s:="", i:=1
Loop % r.Length()//3
s.="," (r[i++]-x) "/" (r[i++]-y) "/" r[i++]
txt:=SubStr(s,2), color:="##" dRGB
}
s:="`nText.=""|<" Comment ">" color "$" txt """`n"
if (cmd="AllAdd")
{
Event:=cmd, Result:=s
Gui, Hide
return
}
x:=px-ww+CutLeft+(nW-CutLeft-CutRight)//2
y:=py-hh+CutUp+(nH-CutUp-CutDown)//2
s:=StrReplace(s, "Text.=", "Text:="), r:=StrSplit(Lang["s8"],"|")
s:="`; #Include <FindText>`n"
. "`nt1:=A_TickCount, X:=Y:=""""`n" s
. "`nif (ok:=FindText(X, Y, " x "-150000, "
. y "-150000, " x "+150000, " y "+150000, 0, 0, Text))"
. "`n{"
. "`n `; FindText().Click(" . "X, Y, ""L"")"
. "`n}`n"
. "`n`; ok:=FindText(""wait"",3, 0,0,0,0,0,0,Text) `; Wait 3 seconds for appear"
. "`n`; ok:=FindText(""wait0"",-1, 0,0,0,0,0,0,Text) `; Wait indefinitely for disappear`n"
. "`nMsgBox, 4096, Tip, `% """ r[1] ":``t"" Round(ok.Length())"
. "`n . ""``n``n" r[2] ":``t"" (A_TickCount-t1) "" " r[3] """"
. "`n . ""``n``n" r[4] ":``t"" X "", "" Y"
. "`n . ""``n``n" r[5] ":``t<"" (Comment:=ok[1].id) "">""`n"
. "`nfor i,v in ok"
. "`n if (i<=2)"
. "`n FindText().MouseTip(ok[i].x, ok[i].y)`n"
Event:=cmd, Result:=s
Gui, Hide
return
Case "Save":
x:=px-ww+CutLeft, w:=nW-CutLeft-CutRight
y:=py-hh+CutUp, h:=nH-CutUp-CutDown
%Gui_%("ScreenShot"
, x "|" y "|" (x+w-1) "|" (y+h-1) "|0")
return
Case "KeyDown":
Critical
if (A_Gui!="FindText_Main")
return
if (A_GuiControl="scr")
SetTimer, %Gui_ShowPic%, -150
else if (A_GuiControl="ClipText")
{
GuiControlGet, s, FindText_Main:, ClipText
GuiControl, FindText_Main:, MyPic, % Trim(this.ASCII(s),"`n")
}
return
Case "ShowPic":
ControlGet, i, CurrentLine,,, ahk_id %hscr%
ControlGet, s, Line, %i%,, ahk_id %hscr%
GuiControl, FindText_Main:, MyPic, % Trim(this.ASCII(s),"`n")
return
Case "LButtonDown":
Critical
if (A_Gui!="FindText_Capture")
return %Gui_%("KeyDown")
MouseGetPos,,,, k2, 2
if (k1:=Round(Cid_[k2]))<1
return
Gui, FindText_Capture: Default
if (k1>71*25)
{
k3:=nW*nH+(k1-71*25)+dx
k1:=(show[k3]:=!show[k3]) ? 0x0000FF : 0xAAFFFF
SendMessage, 0x2001, 0, k1,, % "ahk_id " k2
return
}
k2:=Mod(k1-1,71)+dx, k3:=(k1-1)//71+dy
if (k2>=nW || k3>=nH)
return
k1:=k, k:=k3*nW+k2+1, k2:=c
if (MultiColor and show[k])
{
c:="," Mod(k-1,nW) "/" k3 "/"
. Format("{:06X}",cors[k]&0xFFFFFF)
, Result.=InStr(Result,c) ? "":c
ToolTip, % Trim(Result,"/,")
}
else if (Modify and bg!="" and show[k])
{
c:=((ascii[k]:=!ascii[k]) ? "Black":"White")
, %Gui_%("SetColor")
}
else
{
c:=cors[k], cors.SelPos:=k
GuiControl,, SelGray, % gray[k]
GuiControl,, SelColor, % Format("0x{:06X}",c&0xFFFFFF)
GuiControl,, SelR, % (c>>16)&0xFF
GuiControl,, SelG, % (c>>8)&0xFF
GuiControl,, SelB, % c&0xFF
}
k:=k1, c:=k2
return
Case "MouseMove":
static PrevControl:=""
if (PrevControl!=A_GuiControl)
{
PrevControl:=A_GuiControl
SetTimer, %Gui_ToolTip%, % PrevControl ? -500 : "Off"
SetTimer, %Gui_ToolTipOff%, % PrevControl ? -5500 : "Off"
ToolTip
}
return
Case "ToolTip":
MouseGetPos,,, _TT
IfWinExist, ahk_id %_TT% ahk_class AutoHotkeyGUI
ToolTip, % Tip_Text[PrevControl]
return
Case "ToolTipOff":
ToolTip
return
Case "CutL2","CutR2","CutU2","CutD2":
Gui, FindText_Main: Default
GuiControlGet, s,, MyPic
s:=Trim(s,"`n") . "`n", v:=SubStr(cmd,4,1)
if (v="U")
s:=RegExReplace(s,"^[^\n]+\n")
else if (v="D")
s:=RegExReplace(s,"[^\n]+\n$")
else if (v="L")
s:=RegExReplace(s,"m`n)^[^\n]")
else if (v="R")
s:=RegExReplace(s,"m`n)[^\n]$")
GuiControl,, MyPic, % Trim(s,"`n")
return
Case "Update":
Gui, FindText_Main: Default
GuiControl, Focus, scr
ControlGet, i, CurrentLine,,, ahk_id %hscr%
ControlGet, s, Line, %i%,, ahk_id %hscr%
if !RegExMatch(s,"(<[^>\n]*>[^$\n]+\$)\d+\.[\w+/]+",r)
return
GuiControlGet, v,, MyPic
v:=Trim(v,"`n") . "`n", w:=Format("{:d}",InStr(v,"`n")-1)
v:=StrReplace(StrReplace(v,"0","1"),"_","0")
s:=StrReplace(s,r,r1 . w "." this.bit2base64(v))
v:="{End}{Shift Down}{Home}{Shift Up}{Del}"
ControlSend,, %v%, ahk_id %hscr%
Control, EditPaste, %s%,, ahk_id %hscr%
ControlSend,, {Home}, ahk_id %hscr%
return
Case "Load_Language_Text":
s:="
(
Myww = Width = Adjust the width of the capture range
Myhh = Height = Adjust the height of the capture range
AddFunc = Add = Additional FindText() in Copy
NowHotkey = Hotkey = Current screenshot hotkey
SetHotkey1 = = First sequence Screenshot hotkey
SetHotkey2 = = Second sequence Screenshot hotkey
Apply = Apply = Apply new screenshot hotkey and adjusted capture range values
CutU2 = CutU = Cut the Upper Edge of the text in the edit box below
CutL2 = CutL = Cut the Left Edge of the text in the edit box below
CutR2 = CutR = Cut the Right Edge of the text in the edit box below
CutD2 = CutD = Cut the Lower Edge of the text in the edit box below
Update = Update = Update the text in the edit box below to the line of Code
GetRange = GetRange = Get screen range to clipboard and update the search range of the Code
GetOffset = GetOffset = Get position offset relative to the Text from the Code and update FindText().Click()
GetClipOffset = GetOffset2 = Get position offset relative to the Text from the Left Box
Capture = Capture = Initiate Image Capture Sequence
CaptureS = CaptureS = Restore the Saved ScreenShot by Hotkey and then start capturing
Test = Test = Test the Text from the Code to see if it can be found on the screen
TestClip = Test2 = Test the Text from the Left Box and copy the result to Clipboard
Paste = Paste = Paste the Text from Clipboard to the Left Box
CopyOffset = Copy2 = Copy the Offset to Clipboard
Copy = Copy = Copy the selected or all of the code to the clipboard
Reset = Reset = Reset to Original Captured Image
SplitAdd = SplitAdd = Using Markup Segmentation to Generate Text Library
AllAdd = AllAdd = Append Another FindText Search Text into Previously Generated Code
OK = OK = Create New FindText Code for Testing
Cancel = Cancel = Close the Window Don't Do Anything
Save = SavePic = Save the trimmed original image to the default directory
Gray2Two = Gray2Two = Converts Image Pixels from Gray Threshold to Black or White
GrayDiff2Two = GrayDiff2Two = Converts Image Pixels from Gray Difference to Black or White
Color2Two = Color2Two = Converts Image Pixels from Color Similar to Black or White
ColorPos2Two = ColorPos2Two = Converts Image Pixels from Color Position to Black or White
ColorDiff2Two = ColorDiff2Two = Converts Image Pixels from Color Difference to Black or White
SelGray = Gray = Gray value of the selected color
SelColor = Color = The selected color
SelR = R = Red component of the selected color
SelG = G = Green component of the selected color
SelB = B = Blue component of the selected color
RepU = -U = Undo Cut the Upper Edge by 1
CutU = U = Cut the Upper Edge by 1
CutU3 = U3 = Cut the Upper Edge by 3
RepL = -L = Undo Cut the Left Edge by 1
CutL = L = Cut the Left Edge by 1
CutL3 = L3 = Cut the Left Edge by 3
Auto = Auto = Automatic Cut Edge after image has been converted to black and white
RepR = -R = Undo Cut the Right Edge by 1
CutR = R = Cut the Right Edge by 1
CutR3 = R3 = Cut the Right Edge by 3
RepD = -D = Undo Cut the Lower Edge by 1
CutD = D = Cut the Lower Edge by 1
CutD3 = D3 = Cut the Lower Edge by 3
Modify = Modify = Allows Modify the Black and White Image
MultiColor = FindMultiColor = Click multiple colors with the mouse, then Click OK button
Undo = Undo = Undo the last selected color
Comment = Comment = Optional Comment used to Label Code ( Within <> )
Threshold = Gray Threshold = Gray Threshold which Determines Black or White Pixel Conversion (0-255)
GrayDiff = Gray Difference = Gray Difference which Determines Black or White Pixel Conversion (0-255)
Similar1 = Similarity = Adjust color similarity as Equivalent to The Selected Color
Similar2 = Similarity = Adjust color similarity as Equivalent to The Selected Color
DiffR = R = Red Difference which Determines Black or White Pixel Conversion (0-255)
DiffG = G = Green Difference which Determines Black or White Pixel Conversion (0-255)
DiffB = B = Blue Difference which Determines Black or White Pixel Conversion (0-255)
DiffRGB = R/G/B = Determine the allowed R/G/B Error (0-255) when Find MultiColor
Bind0 = BindWin1 = Bind the window and Use GetDCEx() to get the image of background window
Bind1 = BindWin1+ = Bind the window Use GetDCEx() and Modify the window to support transparency
Bind2 = BindWin2 = Bind the window and Use PrintWindow() to get the image of background window
Bind3 = BindWin2+ = Bind the window Use PrintWindow() and Modify the window to support transparency
Bind4 = BindWin3 = Bind the window and Use PrintWindow(,,3) to get the image of background window
OK2 = OK = Restore this ScreenShot
Cancel2 = Cancel = Close the Window Don't Do Anything
ClearAll = ClearAll = Clean up all saved ScreenShots
OpenDir = OpenDir = Open the saved screenshots directory
SavePic = SavePic = Select a range and save as a picture
ClipText = = Displays the Text data from clipboard
Offset = = Displays the results of GetOffset2
s1 = FindText
s2 = Gray|GrayDiff|Color|ColorPos|ColorDiff|MultiColor
s3 = Capture Image To Text
s4 = Capture Image To Text And Find Text Tool
s5 = Position|First click RButton\nMove the mouse away\nSecond click RButton
s6 = Unbind Window using
s7 = Please drag a range with the LButton\nCoordinates are copied to clipboard
s8 = Found|Time|ms|Pos|Result
s9 = Success
s10 = The Capture Position|Perspective binding window\nRight click to finish capture
s11 = Please Set Gray Difference First
s12 = Please select the core color first
s13 = Please convert the image to black or white first
s14 = Can't be used in ColorPos mode, because it can cause position errors
s15 = Are you sure about the scope of your choice?\n\nIf not, you can choose again
)"
Lang:=[], Tip_Text:=[]
Loop Parse, s, `n, `r
if InStr(v:=A_LoopField, "=")
r:=StrSplit(StrReplace(v,"\n","`n"), "=", "`t ")
, Lang[r[1]]:=r[2], Tip_Text[r[1]]:=r[3]
return
}
}
} ;// Class End
;================= The End =================
;
;================= The End =================
SetTitleMatchMode, 2
#IfWinActive Twitch
§::
mousemove, 20, 20, 0, r
sleep, 550
{
{
CoordMode, Screen
Text:="|<ljudspeaker>*147$17.kT1Uy31w63sA7kMDUkT1Uy31w63sA7kMDUkT1Uy31w63sA7kMDUkT1zzy"
WinGetPos, wX, wY, wW, wH, % needle
if (ok:=FindText(wX, wY, wW, wH, 0, 0, Text))
{
X:=ok.1.x, Y:=ok.1.y, Comment:=ok.1.id
mousemove, X+34, Y-1
}
}
sleep, 300
{
CoordMode, Screen
Text:="|<rundbolliljudbar>*128$17.80AU06000000000000000000000000000000000000000000E00k03s0S"
;*148$24.07s00s701U1U600MA00A8004M006k003k003U001U001U001U001U001k003k003k003s007w00Dw00Dz00zzU1zzwDzU"
WinGetPos, wX, wY, wW, wH, % needle
if (ok:=FindText(wX, wY, wW, wH, 0, 0, Text))
{
X:=ok.1.x, Y:=ok.1.y, Comment:=ok.1.id
mousemove, X, Y-1
If (GetKeyState("lbutton", "P"))
send, {LButton Down}
else
send, {lbutton down}
}
}
}
return
Re: FindText - Capture screen image into text and then find it
@maxkill Ah ok, well if you have the FIND TEXT function written underneath the code then you don't need the #include File. Gotchya.
I like to have all that code below into a separate script called FINDTEXT and then just add the #include and paste the path in. Much neater
I like to have all that code below into a separate script called FINDTEXT and then just add the #include and paste the path in. Much neater
Re: FindText - Capture screen image into text and then find it
Hi,
I love your code and I started using it for a few projects. However, for some reason after changing my computer for a new one with new monitors, when I try to capture text or images on one of the external monitors, FindText returns a blank capture image (I'm using a laptop with 2 external monitors). If I capture from the laptop screen, everything works but if I caption on either of the other 2 monitors, I get a blank image.
Do you know why this is appening?
Also, if I capture from the laptop monitor but then search for the image string on one of the 2 other monitors, the string/image is not found.
Thank you so much for your work.
Paul
I love your code and I started using it for a few projects. However, for some reason after changing my computer for a new one with new monitors, when I try to capture text or images on one of the external monitors, FindText returns a blank capture image (I'm using a laptop with 2 external monitors). If I capture from the laptop screen, everything works but if I caption on either of the other 2 monitors, I get a blank image.
Do you know why this is appening?
Also, if I capture from the laptop monitor but then search for the image string on one of the 2 other monitors, the string/image is not found.
Thank you so much for your work.
Paul
Re: FindText - Capture screen image into text and then find it
I don’t know the answer but help can be few & far between in this thread. So i’ll just ask basic questions that you didn’t provide like….
Are you running the latest version 8.6 on Date : 2021-09-12 ?
Also are you using the window Bind buttons?
I saw a long answer in this very long thread about this somewhere. Have a good search for keywords if you haven’t already
Are you running the latest version 8.6 on Date : 2021-09-12 ?
Also are you using the window Bind buttons?
I saw a long answer in this very long thread about this somewhere. Have a good search for keywords if you haven’t already
Re: FindText - Capture screen image into text and then find it
Hi,
Thanks for your reply. Yes, I am using the latest version. I'm not sure what you mean by "Bind buttons".
I just can't figure out why it worked on my previous computer but not anymore with my new setup. I'll keep looking for the answer.
Paul
Thanks for your reply. Yes, I am using the latest version. I'm not sure what you mean by "Bind buttons".
I just can't figure out why it worked on my previous computer but not anymore with my new setup. I'll keep looking for the answer.
Paul
Re: FindText - Capture screen image into text and then find it
After you capture your image, there are BIND WIN buttons. Pretty sure they are for external screens etc.
see pic attached.
- Attachments
-
- InkedBind_LI.jpg (45.27 KiB) Viewed 6947 times
Last edited by SteveMylo on 16 Jan 2022, 16:24, edited 1 time in total.
Re: FindText - Capture screen image into text and then find it
hello again!
I seached the op for answers and looked at guides, but unsure how to do 3 things with the new code (somehow managed with old code but now not sure)
1. how do I search an area around the mousetip let's say a rectangle of a certain size only? how do the + - work
2. how do I search for example the bottom section of the screen lets say a long horizonal rectangle to the left of mousetip (but not the area in between)?
3. how do I move the cursor slightly after image found if I want to ajust the exactness of coordinates found?
(as of now I just use this line to adjust slightly: mousemove, 0, 2, 0, R)
perhaps common questions like these and pedagocial answers to each of these, questions us noobs might have, might be useful in the op guides so people can use it more easy should be easy to find this info in my humble opinion but can't really find an easy guide for these simple tasks, also giving some simple examples would help a lot I think. a simple guide to search portions of the screen and the active window would probably also be useful.
for now personally I would just love these 3 questions answered
right now it searches the whole screen with this code I'd reckon
Merry Christmas
I seached the op for answers and looked at guides, but unsure how to do 3 things with the new code (somehow managed with old code but now not sure)
1. how do I search an area around the mousetip let's say a rectangle of a certain size only? how do the + - work
2. how do I search for example the bottom section of the screen lets say a long horizonal rectangle to the left of mousetip (but not the area in between)?
3. how do I move the cursor slightly after image found if I want to ajust the exactness of coordinates found?
(as of now I just use this line to adjust slightly: mousemove, 0, 2, 0, R)
perhaps common questions like these and pedagocial answers to each of these, questions us noobs might have, might be useful in the op guides so people can use it more easy should be easy to find this info in my humble opinion but can't really find an easy guide for these simple tasks, also giving some simple examples would help a lot I think. a simple guide to search portions of the screen and the active window would probably also be useful.
for now personally I would just love these 3 questions answered
right now it searches the whole screen with this code I'd reckon
Code: Select all
t1:=A_TickCount, X:=Y:=""
Text:="|<>##0$0/0/615C5C"
if (ok:=FindText(X, Y, 2148-150000, 789-150000, 2148+150000, 789+150000, 0, 0, Text))
{
; FindText().Click(X, Y, "L")
}
BlockInput, off
mousemove, x, y
return
Re: FindText - Capture screen image into text and then find it
To adjust the coordinates , After you capture your image,
- Double click on the image/Text String (as seen in Pic attached) which highlights blue
- Then click paste , which is below the CaptureS button.
- Then click the 'Get Offset 2' Button.
- Then click where you really want the mouse to move using the same as Capture method
Then it's up to you to paste those and replace the X,Y, in your code ===> FindText().Click(X, Y, "L")
- Attachments
-
- Capture.JPG (61.13 KiB) Viewed 6826 times
Re: FindText - Capture screen image into text and then find it
@SteveMylo
Awesome thanks I'll try that Steve! How about the other 2 points, what about those??
Awesome thanks I'll try that Steve! How about the other 2 points, what about those??
Re: FindText - Catch screen image into text and then find it
WOuld it be possible to hire you to write a specific type of script for me?
I'd like to scan the screen in a screen shot for text... if certain words in a list are found i'd like to underline them in green.... or highlight them....
if the user hovers over those words i want an editable text box to pop up....
so users can take notes on the definitions ≈ associations w/e in real time FOR THAT WORD OR PHRASE.
is that possible?
it's for my medical students..
abk93@cornell.edu
I'd like to scan the screen in a screen shot for text... if certain words in a list are found i'd like to underline them in green.... or highlight them....
if the user hovers over those words i want an editable text box to pop up....
so users can take notes on the definitions ≈ associations w/e in real time FOR THAT WORD OR PHRASE.
is that possible?
it's for my medical students..
abk93@cornell.edu
Re: FindText - Capture screen image into text and then find it
I don't really know but something a little similar I have an old script from the last version of FIND TEXT.
I did a click and drag to designate where the search needs to look within the Y coordinate range ( aY to bY)
And the X coordinates searches 0 - 315. (see script below)
also..... if you look up the instructions in the actual Funtion, you can designate how FINDTEXT searches.
dir --> Nine directions for searching: up, down, left, right and center
Search for the below in the Function and change the number to how you want the search. (i think)
FindText(ByRef OutputX:="", ByRef OutputY:=""
, x1:=0, y1:=0, x2:=0, y2:=0, err1:=0, err0:=0
, text:="", ScreenShot:=1, FindAll:=1
, JoinText:=0, offsetX:=20, offsetY:=10, dir:=1) ; Change dir:=1 to another number to change the direction of the search. (I think)
*remember if you change the Function, it'll change forever, so make a copy or just past the whole function below your script and change the search Direction. (you don't need to #include if you do this)
Code: Select all
KeyWait, LButton, D
MouseGetPos, aX, aY
Sleep, 11
KeyWait, LButton, U
MouseGetPos, bX, bY
Sleep, 11
t1:=A_TickCount, X:=Y:=""
Text:="|<Track_HL>**50$19.zzzk00Pzzh7wKbz/LRpjTSrRrPrrhRrKbz/Fz5jzyk00Tzzw"
search_Track_HL:
if (ok:=FindText(0, 0, 0, aY, 315, bY, 0, 0, Text))
{
CoordMode, Mouse
X:=ok.1.x, Y:=ok.1.y, Comment:=ok.1.id
MouseClick, Left, X, Y, 1, 3
}
Re: FindText - Capture screen image into text and then find it
@SteveMylo
Thanks I'll give this a go!!
Now to more pressing matters, is it possible to have a textimage searched but a 360 version of the image - for example a cross that keeps spinning will look different in each angle - also, if the cross itself shifts slightly
any way to make this find that or impossible perhaps?
Thanks I'll give this a go!!
Now to more pressing matters, is it possible to have a textimage searched but a 360 version of the image - for example a cross that keeps spinning will look different in each angle - also, if the cross itself shifts slightly
any way to make this find that or impossible perhaps?
Re: FindText - Capture screen image into text and then find it
Hey guys, I've got a question. I used the script to find a name (script below).
When I press a button it returns a msgbox with the position. If for example that returns 'Pos: 900, 500' and I want to subtract X from Y I could write: MsgBox, % X-Y
But instead of a MsgBox I want to store this value and use it for something else later. What would I have to do in order to achieve that?
When I press a button it returns a msgbox with the position. If for example that returns 'Pos: 900, 500' and I want to subtract X from Y I could write: MsgBox, % X-Y
But instead of a MsgBox I want to store this value and use it for something else later. What would I have to do in order to achieve that?
Code: Select all
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
; #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.
#Include FindText.ahk
8::
t1:=A_TickCount, X:=Y:=""
Text:="|<Player1>*131$45.zzzzzzzzzzzzzzzy7nzAzaT0CTtbwnlsnzwzzyTaEtbAnnzk3AlaT3yANYwnw3nnADaTwCSNVwnzwnnAbaSTaSNaQnlsnnAnaT0CSNbAny3nnAsaTzzzzzzzzzzzzzzw"
if (ok:=FindText(X, Y, 1379-150000, 821-150000, 1379+150000, 821+150000, 0, 0, Text))
{
;FindText().Click(X, Y, "L")
}
MsgBox, 4096, Tip, % "Found:`t" Round(ok.Length()) . "`n`nPos:`t" X ", " Y
return