Page 18 of 55
Re: FindText - Capture screen image into text and then find it
Posted: 13 Sep 2019, 19:57
by Sashabot
Hello anyone reading this,
I was using FindText to search for a certain area, It was working great but I still had some problems with my code, I was wondering if anyone could help.
The area I am trying to search is 424, 915 the way I put it in was
Code: Select all
if (ok:=FindText(424, 915, A_ScreenWidth, A_ScreenHeight, 424, 915, Text))
However this still searches the whole screen, I can not figure out how to set the correct cords, I tried replacing all the values in different ways. Thank you for reading
Re: FindText - Capture screen image into text and then find it
Posted: 14 Sep 2019, 02:13
by manehscripts
reluct wrote: ↑12 Sep 2019, 13:34
What to write there (
ok:=FindText(0, 0, A_ScreenWidth, A_ScreenHeight, 0, 0, Text, , 0)), if I want the script to work if It does not find the text?
Not:=?
Hi,
"ok" is just a variable. You can change "ok" to any name you like.
Re: FindText - Capture screen image into text and then find it
Posted: 14 Sep 2019, 02:25
by gregster
@Sashabot: You should look at the function definition and parameters again:
The
,424, 915 in the 5th and 6th parameter seem certainly wrong. These parameters are
not coordinates or width/height in pixels and can only be between 0 and 1, afaics (see below).
https://www.autohotkey.com/boards/viewtopic.php?p=146096#p146096 wrote:the parameters of X, Y, W, H to used determine a search area
X,Y are the center point about which search was conducted (where your red box was when clicked)
W,H are the offset distance from the center defining the width and height of search area (not the red box's width and height),
W and H are hardcoded to 150000 indicating a search of the entire screen.
So, effectively the search range is (X-W, Y-H)-->(X+W, Y+H).
X, Y, W, and H are calculated for you, and generally you're going to leave them alone.
If we are searching the whole screen, why even have the options? Consider 2 appropriate matches on the screen, Findtext will return the first
one found, but you want the second. Having X,Y allows you to get close to one desired, and constraining the W or H arguments can allow for
avoiding the other match and getting the desired match.
err1 is the character "0" fault-tolerant in percentage (0-1) Default 0.
err0 is the character "_" fault-tolerant in percentage.(0-1) Default 0.
I've never used this function myself, but you should probably look at the 'detailed usage' posts that are recommended in the first post (
https://www.autohotkey.com/boards/viewtopic.php?f=6&t=17834#p86796) and refer to these, if they leave any question open.
Re: FindText - Capture screen image into text and then find it
Posted: 14 Sep 2019, 02:46
by gregster
reluct wrote: ↑12 Sep 2019, 13:34
What to write there (
ok:=FindText(0, 0, A_ScreenWidth, A_ScreenHeight, 0, 0, Text, , 0)), if I want the script to work if It does not find the text?
Not:=?
Try
! (which means logical
NOT):
Code: Select all
if !( ok := FindText(0, 0, A_ScreenWidth, A_ScreenHeight, 0, 0, Text, , 0) )
; or just
if !FindText(0, 0, A_ScreenWidth, A_ScreenHeight, 0, 0, Text, , 0) ; if you don't need the arbitrarily named variable 'ok' later
because:
0 means
false in boolean terms. Then,
not 0 means
true.
Re: FindText - Capture screen image into text and then find it
Posted: 14 Sep 2019, 03:00
by reluct
Code: Select all
if !( ok := FindText(0, 0, A_ScreenWidth, A_ScreenHeight, 0, 0, Text, , 0) )
Thanks it works.
Re: FindText - Capture screen image into text and then find it
Posted: 15 Sep 2019, 20:38
by Ben
@ricardo231
ricardo231 wrote: ↑26 Aug 2019, 15:34
@Ben if I use your code I can search the converted image on any screen without failing?
If you have a monitor to the left of your primary monitor the default code will fail.
FindText(0, 0, A_ScreenWidth, A_ScreenHeight, 0, 0, Text)
0,0 is the top-left coordinate of the
primary monitor, so any monitor to the
left has to be addressed with a negative X value.
I'm not trying to make a big deal of this, but until I realized what was happening it was a bit frustrating for me when code worked on one monitor but not another.
I created a FindText wrapper function,
FindTextAW(), that will apply FindText to the
active window. This improves the find speed when you have a high resolution desktop area. You can find a description and source code for it
here.
Re: FindText - Capture screen image into text and then find it
Posted: 21 Sep 2019, 17:48
by Elixium
How would you use findtext to find multiple texts within a single script? e.g.
something like this.
Text:="|<>stuff"
Text2:="|<>morestuff"
if (ok:=FindText(0, 0, A_ScreenWidth, A_ScreenHeight, 0, 0, Text))
if (ok:=FindText(0, 0, A_ScreenWidth, A_ScreenHeight, 0, 0, Text2))
with the script I want to.
Find word "a" then do something, find word "b" & do something different.
I have the script working fine with single words.
Re: FindText - Capture screen image into text and then find it
Posted: 22 Sep 2019, 03:20
by Elixium
Elixium wrote: ↑21 Sep 2019, 17:48
How would you use findtext to find multiple texts within a single script? e.g.
something like this.
Text:="|<>stuff"
Text2:="|<>morestuff"
if (ok:=FindText(0, 0, A_ScreenWidth, A_ScreenHeight, 0, 0, Text))
if (ok:=FindText(0, 0, A_ScreenWidth, A_ScreenHeight, 0, 0, Text2))
with the script I want to.
Find word "a" then do something, find word "b" & do something different.
I have the script working fine with single words.
I've figured this you simply repeat the text code like below to overwrite the value of "text" for the next bit of code that gets executed instead of trying to have a separate text2 value. Thanks to the author for this great script.
Text:="|<>stuff"
Text:="|<>morestuff"
if (ok:=FindText(0, 0, A_ScreenWidth, A_ScreenHeight, 0, 0, Text))
if (ok:=FindText(0, 0, A_ScreenWidth, A_ScreenHeight, 0, 0, Text))
Re: FindText - Capture screen image into text and then find it
Posted: 29 Sep 2019, 14:45
by potroveio
any ideas on how to make this run on an inactive or minimized window or on virtual destkop on the background? thanks!!
Re: FindText - Capture screen image into text and then find it
Posted: 06 Oct 2019, 23:57
by RinkaDink
Dears, good morning.
Just copied the code from page 1 and getting error on the code (Parameter#2 Invalid) in row 477: GUI,ADD,TAB3
Previous versions without any problems.
Best regards
RinkaDink
Re: FindText - Capture screen image into text and then find it
Posted: 09 Oct 2019, 17:17
by Sashabot
@gregster
If i understood it I wouldn't be asking for help...
Re: FindText - Capture screen image into text and then find it
Posted: 10 Oct 2019, 07:45
by boiler
RinkaDink wrote: ↑06 Oct 2019, 23:57
Dears, good morning.
Just copied the code from page 1 and getting error on the code (Parameter#2 Invalid) in row 477: GUI,ADD,TAB3
Previous versions without any problems.
Best regards
RinkaDink
Update to the latest version of AHK. It needs to be v1.1.23.00 or later in order to use Tab3.
Re: FindText - Capture screen image into text and then find it
Posted: 10 Oct 2019, 07:56
by boiler
Sashabot wrote: ↑13 Sep 2019, 19:57
I was using FindText to search for a certain area, It was working great but I still had some problems with my code, I was wondering if anyone could help.
The area I am trying to search is 424, 915 the way I put it in was
Code: Select all
if (ok:=FindText(424, 915, A_ScreenWidth, A_ScreenHeight, 424, 915, Text))
However this still searches the whole screen, I can not figure out how to set the correct cords, I tried replacing all the values in different ways. Thank you for reading
The 4th and 5th parameters where you have
424, 915 for a second time are supposed to be a fraction of the number 1 (such as 0.1 for 10%), so your numbers are seen as much greater than 100%. So replace
424, 915 with
0, 0 for those parameters.
Edit: Removed incorrect information.
Re: FindText - Capture screen image into text and then find it
Posted: 10 Oct 2019, 08:04
by boiler
Elixium wrote: ↑21 Sep 2019, 17:48
How would you use findtext to find multiple texts within a single script? e.g.
something like this.
Text:="|<>stuff"
Text2:="|<>morestuff"
if (ok:=FindText(0, 0, A_ScreenWidth, A_ScreenHeight, 0, 0, Text))
if (ok:=FindText(0, 0, A_ScreenWidth, A_ScreenHeight, 0, 0, Text2))
with the script I want to.
Find word "a" then do something, find word "b" & do something different.
I have the script working fine with single words.
You need to put blocks of text after each if statement to execute their code only if the associated text is found:
Code: Select all
Text:="|<>stuff"
Text2:="|<>morestuff"
if (ok:=FindText(0, 0, A_ScreenWidth, A_ScreenHeight, 0, 0, Text))
{
MsgBox, % Text " was found"
; all the code you want to execute if Text is found goes here
}
if (ok:=FindText(0, 0, A_ScreenWidth, A_ScreenHeight, 0, 0, Text2))
{
MsgBox, % Text2 " was found"
; all the code you want to execute if Text2 is found goes here
}
If you want it to continuously check for those pieces of text and execute the associated code over and over, then you can put it in a loop:
Code: Select all
loop
{
if (ok:=FindText(0, 0, A_ScreenWidth, A_ScreenHeight, 0, 0, Text))
{
MsgBox, % Text " was found"
; all the code you want to execute if Text is found goes here
}
if (ok:=FindText(0, 0, A_ScreenWidth, A_ScreenHeight, 0, 0, Text2))
{
MsgBox, % Text2 " was found"
; all the code you want to execute if Text2 is found goes here
}
}
Edit: Removed incorrect information.
Re: FindText - Capture screen image into text and then find it
Posted: 10 Oct 2019, 12:44
by gregster
boiler wrote: ↑10 Oct 2019, 08:04
The := is an assignment operator only, and you are assigning the result to the variable ok instead of comparing it, making it always evaluate to true no matter the result of the FindText.
I think you are mistaken re the result of
Findtext()
Code: Select all
if (ok:=FindText(true)) ; true
msgbox % "true: " ok
if (ok:=FindText(false)) ; false
msgbox not executed
else
msgbox % "false: "ok
Findtext(bool){
return bool
}
Yes, this is not suited to
compare the variable
ok with the result of
Findtext(), but...
the
if (ok:=FindText(0, 0, A_ScreenWidth, A_ScreenHeight, 0, 0, Text)) line can actually have its use. It actually comes from the codebox in the original, first post of this topic (and I guess, there it was picked up by various users):
Code: Select all
;[...]
if (ok:=FindText(0, 0, A_ScreenWidth, A_ScreenHeight, 0, 0, Text))
{
CoordMode, Mouse
X:=ok.1.1, Y:=ok.1.2, W:=ok.1.3, H:=ok.1.4, Comment:=ok.1.5, X+=W//2, Y+=H//2
; Click, `%X`%, `%Y`%
}
MsgBox, 4096, `% ok.MaxIndex(), `% "Time:``t" (A_TickCount-t1) " ms``n``n"
. "Pos:``t[%x%, %y%] " X ", " Y "``n``n"
. "Result:``t" (ok ? "Success ! " Comment : "Failed !")
for i,v in ok
;[...]
As
Findtext() returns an array if successful, you can do an if-check for
true and an assignment of that returned array (if one is returned) to the variable
ok at the same time.
In the code above,
ok is not a variable that gets compared to the result of
Findtext(), but a variable that gets assigned an array. Later, this variable/array is used for various things...
Re: FindText - Capture screen image into text and then find it
Posted: 10 Oct 2019, 12:59
by boiler
Ah, good point. Its return value is true or false. My bad.
Re: FindText - Capture screen image into text and then find it
Posted: 11 Oct 2019, 19:49
by uwscia
Just wanted to ask if the 1st post could be updated to reflect the current state of the function, having to read the whole thread is cumbersome.
And would like a better built in array for the current output of found images as described below.
FOR SINGLE IMAGE DETECTION PER CYCLE
Code: Select all
Image := "|<SINGLE_PIC_NAME>*76"
Pic(Image,1) ; <--- This function is posted in this thread not going to add it's redundant.
If (ok:=FindText(0, 35, 1200, 60, 0, 0, Image) <--- Without the use of the Pic() Function.
If (ok:=FindText(0, 35, 1200, 60, 0, 0, this.Pic("SINGLE_PIC_NAME")))
{
TrayTip , FindText Function, Found, 5, 16 ; <--- Personally don't use MSGBOX when not needed, it traps the code.
} Else {
TrayTip , FindText Function, No Image Found, 5, 16
}
FOR MULTI IMAGE DETECTION PER CYCLE
Code: Select all
Image :="|<MULTI_PIC_NAME1>*76"
Image .="|<MULTI_PIC_NAME2>*76"
Image .="|<MULTI_PIC_NAME3>*76"
Image .="|<MULTI_PIC_NAME4>*76"
Pic(Image,1) <---- Can be added as a single dump or
static ID := 0
List := {}
INIREAD, INIList, FILEname
Loop, parse, INIList, 'n
{
ID++
INIREAD, IDvar, FILEname, %A_loopField%, ID
INIREAD, IMAGEvar, FILEname, %A_loopField%, IMAGE
Pic(IMAGEvar,1)
params := {Name:A_loopField, ID:IDvar, Image:IMAGEvar, X:X, Y:Y, W:W, XW:XW, YH:YH}
this.List[this.ID] := params
}
;ONLY ONE OPTION ABOVE IS REQUIRED JUST SHOWING DIFFERENT METHODS.
If (FOUND := FindText(0, 35, 1200, 60, 0, 0, this.Pic("MULTI_PIC_NAME1|MULTI_PIC_NAME2|MULTI_PIC_NAME3|MULTI_PIC_NAME4")))
{
;THIS IS WERE ID LIKE THE CORE CODE TO BE UPDATED TO A BETTER ASSOCIATED ARRAY AS SHOWN ABOVE IN THE INIREAD LOOP
;OLD ok.1+#1-5
;CURRENT ok.1.#1-5
Loop, % FOUND.MaxIndex() ; IF COMPARING FOUND ARRAY TO LIST ARRAY USE A_Index-1 cause arrays start at 0 and Loops default to 1
{
FOUND[A_Index].ID ; This is "Comment" as seen in the current code.
FOUND[A_Index].X
FOUND[A_Index].Y
FOUND[A_Index].W
FOUND[A_Index].H
FOUND[A_Index].XW := FOUND[A_Index].X+=FOUND[A_Index].W//2
FOUND[A_Index].YH := FOUND[A_Index].Y+=FOUND[A_Index].H//2
;ABOVE IS JUST BROKEN OUT TO SHOW THE OUTPUTS OF THE "FOUND" ARRAY IF CORE CODE WAS REWRITTEN.
TrayTip , FindText Function, % FOUND[A_Index].ID, 5, 16
If FOUND[A_Index].ID == "MULTI_PIC_NAME1"
{
;DO SOMETHING IF IMAGE 1 IS FOUND
} Etc.
;OR USED MORE DYNAMICALLY
Parent := A_Index
Loop, % List.MaxIndex()
{
If (List[A_Index-1].ID == FOUND[Parent].ID)
{
}
}
}
} Else {
TrayTip , FindText Function, No Image Found, 5, 16
}
Re: FindText - Capture screen image into text and then find it
Posted: 19 Oct 2019, 01:01
by thebbandit
Thank you so much for this library! Just stumbled across this and it is quite a thoroughly scripted library, you have done an amazing job on this
Re: FindText - Capture screen image into text and then find it
Posted: 20 Oct 2019, 15:12
by 22chars
Great Library!
Re: FindText - Capture screen image into text and then find it
Posted: 20 Oct 2019, 19:57
by rommmcek
Try if this suits you:
Code: Select all
t1:=A_TickCount
Text:="|<100 Percent>#[email protected]$68.zzszzzzzlzzzzwzzzzzzDzzzyQ00000tzzzzC000007Dzzzb000000tzzznU000007DzztkC7Xrn0tzzws7XxzhU7Dw0Q1trvvk0s0zC06QyPg07Dzz01bDa600zzzU0NntXy07zzk06RysxU0zzs01XxyPM07zw00wyTCQ00zy0000000007zzzzzzzzzzzzzzzzzzzzzzzU"
while (!ok:=FindText(0, 0, A_ScreenWidth, A_ScreenHeight, 0, 0, Text))
{
CoordMode, Mouse
X:=ok.1.1, Y:=ok.1.2, W:=ok.1.3, H:=ok.1.4, Comment:=ok.1.5, X+=W//2, Y+=H//2
; Click, %X%, %Y%
Sleep, 300 ; adjust to your needs
}
MsgBox, 4096, % ok.MaxIndex(), % "Time:`t" (A_TickCount-t1) " ms`n`n"
. "Pos:`t[81, 579] " X ", " Y "`n`n"
. "Result:`t" (ok ? "Success ! " Comment : "Failed !")
for i,v in ok
if i<=2
MouseTip(v.1+v.3//2, v.2+v.4//2)
;Here append FindText() function!