Тема: AHK: Генератор 4 чисел.
Есть такая задача.
Нужно найти 4 значное число в окне.
Я подумал и придумал самый примитивный способ "обычный перебор".
Сделал фото 10 цифр от 0-9
И задал координаторы поиска: по 1 цифре; по 2 цифре; по 3 цифре; и 4 цифре.
В конце все цифры складываются в одно.
И я получаю ответ. Все просто и все работает!
Теперь задача в другом.
Этот код находит 1 цифру в диапазоне 250млс- 900млс.
При нахождении 4 цифр диапазон ожидания возрастает от 1сек до 4 сек.
Мне нужно максимально ускорить работу скрипта.
Чтобы до 1 секунды.
setbachline, -1
loop {
WinGetPos,,, W, H, A
ImageSearch, xD, yD, 499, 430, 551, 456, C:\image\NZT_Start\scan_X\dollar2.png
if !ErrorLevel
{
break
}
if ErrorLevel
break
}
; !!! находка кординатов 1 цифры
S1_x1:=xd+5, S1_x2:=S1_x1+15
; !!! находка кординатов 2 цифры
S2_x1:=S1_x2-5, S2_x2:=S1_x2+10
; !!! находка кординатов 3 цифры
s3_x1:=S2_x2-4, s3_x2:=S2_x2+12
; !!! находка кординатов 4 цифры
s4_x1:=S3_x2-5, s4_x2:=S3_x2+8
; !!! находка кординатов по вертикале
S1_y1:=yd-4,
S1_y2:=S1_y1+20
s_num1:= ;
s_num2:= ;
s_num3:= ;
s_num4:= ;
num:=1 ; 1 включить/ 0 - выключить
Generation:
WinActivate, Ahk_class #########
if num = 1
scan_x1 := S1_x1, scan_x2 := S1_x2
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~n2
if num = 2
scan_x1 := S2_x1, scan_x2 := S2_x2
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~n3
if num = 3
scan_x1 := s3_x1, scan_x2 := s3_x2
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~n4
if num = 4
scan_x1 := s4_x1, scan_x2 := s4_x2
scan_y1 := S1_y1
scan_y2 := S1_y2
;~!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 0
loop {
WinGetPos,,, W, H, A
ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\0.png
if !ErrorLevel
{
stack_n = 0
goto, boomnumber
}
if ErrorLevel
break
}
loop {
WinGetPos,,, W, H, A
ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\00.png
if !ErrorLevel
{
stack_n = 0
goto, boomnumber
}
if ErrorLevel
break
}
;~!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1
loop {
WinGetPos,,, W, H, A
ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\1.png
if !ErrorLevel
{
stack_n = 1
break
}
if ErrorLevel
break
}
loop {
WinGetPos,,, W, H, A
ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\point\11.png
if !ErrorLevel
{
s_num4 := 0
stack_n = 1
goto, boomnumber
}
if ErrorLevel
break
}
;~!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2
loop {
WinGetPos,,, W, H, A
ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\2.png
if !ErrorLevel
{
stack_n = 2
break
}
if ErrorLevel
break
}
loop {
WinGetPos,,, W, H, A
ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\22.png
if !ErrorLevel
{
stack_n = 2
break
}
if ErrorLevel
break
}
loop {
WinGetPos,,, W, H, A
ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\point\22.png
if !ErrorLevel
{
s_num4 := 0
stack_n = 2
goto, boomnumber
}
if ErrorLevel
break
}
;~!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3
loop {
WinGetPos,,, W, H, A
ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\3.png
if !ErrorLevel
{
stack_n = 3
break
}
if ErrorLevel
break
}
loop {
WinGetPos,,, W, H, A
ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\point\33.png
if !ErrorLevel
{
s_num4 := 0
stack_n = 3
goto, boomnumber
}
if ErrorLevel
break
}
;~!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4
loop {
WinGetPos,,, W, H, A
ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\4.png
if !ErrorLevel
{
stack_n = 4
break
}
if ErrorLevel
break
}
loop {
WinGetPos,,, W, H, A
ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\44.png
if !ErrorLevel
{
stack_n = 4
break
}
if ErrorLevel
break
}
loop {
WinGetPos,,, W, H, A
ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\point\44.png
if !ErrorLevel
{
s_num4 := 0
stack_n = 4
goto, boomnumber
}
if ErrorLevel
break
}
;~!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5
loop {
WinGetPos,,, W, H, A
ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\5.png
if !ErrorLevel
{
stack_n = 5
break
}
if ErrorLevel
break
}
loop {
WinGetPos,,, W, H, A
ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\55.png
if !ErrorLevel
{
stack_n = 5
break
}
if ErrorLevel
break
}
loop {
WinGetPos,,, W, H, A
ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\point\55.png
if !ErrorLevel
{
s_num4 := 0
stack_n = 5
goto, boomnumber
}
if ErrorLevel
break
}
;~!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 6
loop {
WinGetPos,,, W, H, A
ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\6.png
if !ErrorLevel
{
stack_n = 6
break
}
if ErrorLevel
break
}
loop {
WinGetPos,,, W, H, A
ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\66.png
if !ErrorLevel
{
stack_n = 6
break
}
if ErrorLevel
break
}
loop {
WinGetPos,,, W, H, A
ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\point\66.png
if !ErrorLevel
{
s_num4 := 0
stack_n = 6
goto, boomnumber
}
if ErrorLevel
break
}
;~!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 7
loop {
WinGetPos,,, W, H, A
ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\7.png
if !ErrorLevel
{
stack_n = 7
break
}
if ErrorLevel
break
}
loop {
WinGetPos,,, W, H, A
ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\77.png
if !ErrorLevel
{
stack_n = 7
break
}
if ErrorLevel
break
}
loop {
WinGetPos,,, W, H, A
ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\point\77.png
if !ErrorLevel
{
s_num4 := 0
stack_n = 7
goto, boomnumber
}
if ErrorLevel
break
}
;~!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 8
loop {
WinGetPos,,, W, H, A
ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\8.png
if !ErrorLevel
{
stack_n = 8
goto, boomnumber
}
if ErrorLevel
break
}
;~!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 9
loop {
WinGetPos,,, W, H, A
ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\9.png
if !ErrorLevel
{
stack_n = 9
break
}
if ErrorLevel
break
}
loop {
WinGetPos,,, W, H, A
ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\99.png
if !ErrorLevel
{
stack_n = 9
break
}
if ErrorLevel
break
}
loop {
WinGetPos,,, W, H, A
ImageSearch, X, Y, scan_x1, scan_y1, scan_x2, scan_y2, C:\image\NZT_Start\scan_X\point\99.png
if !ErrorLevel
{
s_num4 := 0
stack_n = 9
goto, boomnumber
}
if ErrorLevel
break
}
boomnumber:
if num = 1
{
s_num1 := stack_n, num := 2
goto, generation
}
if num = 2
{
s_num2 := stack_n, num :=3
goto, generation
}
if num = 3
{
s_num3 := stack_n, num :=4
goto, generation
}
number = %s_num1%%s_num2%%s_num3%%s_num4%
Чтобы не думали что просто жду ответа.
С горем пополам разбираю этот сканер. Он не мой ... Нашел.
#persistent ; Делает скрипт постоянно выполняющимся
#NoEnv ; Отменяет проверку для пустых переменных
menu, tray, NoStandard
menu, tray, add,Add Scale,MenuHandler
menu, tray, add,Dec Scale,MenuHandler
menu, tray, add,Exit,MenuHandler
SetBatchLines -1
CoordMode, Mouse, Screen
CoordMode, Tooltip, Screen
CoordMode, Pixel, Screen
Data:="#803+;|,.."
;~ Data:="#"
Length:=StrLen(Data)
nScale:=1
Gui,+Resize
Gui, font,s5,Terminal
;~ Gui, font,s5, Consolas
Gui, Add, Edit, x0 y0 w600 h400 -wrap +HScroll +VScroll vResultText
MsgBox,Ctrl+LButton to start
^LButton::
MouseGetPos, scan_x_start, scan_y_start
currentXpos=%scan_x_start%
currentYpos=%scan_y_start%
ToolTip,``, scan_x_start, scan_y_start
WinGet,TipId,ID,ahk_class tooltips_class32
WinSet, Transparent, 100, ahk_id %TipId%
loop
{
MouseGetPos, scan_x, scan_y
scan_x-=currentXpos
scan_y-=currentYpos
WinMove,ahk_id %TipId%, , , , %scan_x%, %scan_y%
GetKeyState, state, LButton,P
;~ ToolTip,%scan_x% * %scan_y%,,2
TrayTip,Size,%scan_x% * %scan_y%
if state=u
{
ToolTip
TrayTip
break
}
}
CoordMode, Pixel, Screen
CoordMode, Mouse, Screen
MouseGetPos, scan_x_end, scan_y_end
scan_current_y=%scan_y_start%
scan_current_x=%scan_x_start%
scan_current_line:=""
Loop
{
scan_current_x++
if scan_current_x > %scan_x_end%
{
scan_current_line =%scan_current_line%`r`n
scan_current_y:=scan_current_y+nScale
if scan_current_y > %scan_y_end%
{
break
}
Else
{
scan_current_x = %scan_x_start%
Proce:=Ceil(scan_current_y/scan_y_end*100)
TrayTip, ,???? %Proce% `%, , 1
continue
}
}
PixelGetColor, ColorV, %scan_current_x%, %scan_current_y%
b := ColorV >> 16
g := (ColorV >> 8) & 0xFF
r := ColorV & 0xFF
YB:=Ceil((0.3*r)+(0.6*g)+(0.1*b))
dot:=Ceil(YB/255*Length)
StringMid,dot,Data,dot,1
ColorV:="#" . r . g . b
;~ scan_current_line =%scan_current_line%`[color=%ColorV%`]%dot%`[`/color`]
scan_current_line =%scan_current_line%%dot%
}
TrayTip, ,????, , 1
sleep, 1000
TrayTip
GuiControl,,ResultText,%scan_current_line%
Gui, Show,,Reg2Text
return
GuiClose:
GuiControl,,ResultText,,
Gui,Hide
GuiSize:
If (ErrorLevel<>1) And (A_GuiWidth<>0)
{
GuiControl,Move,ResultText,x0 y0 w%A_GuiWidth% h%A_GuiHeight%
}
Return
MenuHandler:
If (A_ThisMenuItemPos=1)
{
nScale+=0.2
TrayTip,,YScale:%nScale%
Sleep 3000
TrayTip,,
}
Else If (A_ThisMenuItemPos=2)
{
nScale-=0.2
TrayTip,,YScale:%nScale%
Sleep 3000
TrayTip,,
}
Else
{
ExitApp
}
Return
if !ErrorLevel
Say, Level UP!