1

Тема: AHK: ImageSearch и массив

Здравствуйте.
С помощью ImageSearch делаю поиск картинок. Если я не нахожу картинку, то переключаюсь в другое окно и выполняю команды. Картинок штук 20, а команды по сути однотипные. В итоге постоянно прыгаю по окнам.

1w:
MouseMove 145, 889
Send {Click}
return

2w:
MouseMove  275, 889
Send {Click}
return

ImageSearch  FoundX, FoundY, 0, 0, A_ScreenWidth, A_ScreenHeight, *50 D:\dir\Screen\1.bmp
if ErrorLevel = 1
{
    gosub 2w     ; переключаюсь на 2 окно
    sleep 1000    
    send 1          ; выполняю команду
    gosub 1w      ; переключаюсь на 1 окно
}
ImageSearch  FoundX, FoundY, 0, 0, A_ScreenWidth, A_ScreenHeight, *50 D:\dir\Screen\2.bmp
if ErrorLevel = 1
{
    gosub 2w
    sleep 1000
    send 2
    gosub 1w
}
return

И так штук 20, не нашел картинку - переключился и назад, искать дальше.

Прошу помочь примером в данном случае. Хочу чтобы производился поиск всех картинок и создавался как бы массив отсутствующих картинок. После поиска переключиться на второе окно и выполнить те команды, которые соответствуют отсутствующим картинкам.

2

Re: AHK: ImageSearch и массив

Вопрос в том, как составить список?

3

Re: AHK: ImageSearch и массив

По стараюсь еще объяснить, если получится.

MissPic1:
send 1

MissPic2:  ; Так до 20.
send 2


ImageSearch  FoundX, FoundY, 0, 0, A_ScreenWidth, A_ScreenHeight, *50 D:\dir\Screen\1.bmp
if ErrorLevel = 1
{
    gosub 2w     ; переключаюсь на 2 окно
    sleep 1000    
    send 1          ; выполняю команду
    gosub 1w      ; переключаюсь на 1 окно
}

Вместо выполнения условия if ErrorLevel = 1 хочу что бы создавалась переменная или метка (не знаю как правильно сказать), к примеру  MissPic1, которая добавляется в ArrayPic

ArrayPic = []
ImageSearch  FoundX, FoundY, 0, 0, A_ScreenWidth, A_ScreenHeight, *50 D:\dir\Screen\1.bmp
if ErrorLevel = 1
{
    ArrayPic += MissPic1
}

После поиска всех требуемых картинок  получаю ArrayPic = MissPic1+MissPic2+...+MissPic20. Если условие по ImageSearch  не соответствуе ErrorLevel = 1, то
MissPic не добавляется в ArrayPic. Когда ArrayPic получен - выполняться примерно следующее:

ImageSearch  FoundX, FoundY, 0, 0, A_ScreenWidth, A_ScreenHeight, *50 D:\dir\Screen\1.bmp
if ErrorLevel = 1
{
    gosub 2w      ; переключаюсь на 2 окно
    sleep 1000    
    ArrayPic        ; Который содержит команды send 1, send 2, send 3...т.е. клавиши или команды, которые соответствуют MissPic
    gosub 1w      ; переключаюсь на 1 окно
}

4

Re: AHK: ImageSearch и массив

Немного поменял работу скрипта. В данном случае MissPic имеет значение, равное отсутствующей картинки.

Loop 
{ 
   Loop 7 
    {
        CoordMode Pixel
        ImageSearch, X, Y, 0, 0, %A_ScreenWidth%, %A_ScreenHeight%, test%A_Index%.bmp   ; Перебираю картинки 
        MissPic += 1 ; Присваиваю каждую картинку к переменной
        if ErrorLevel = 1 
                            { 
            MsgBox Не найдена картинка test%A_Index%.bmp
            sleep 1000
            send %MissPic%
        }
        if ErrorLevel = 0
        MsgBox Найдено test%A_Index%.bmp
        sleep 1000
}
MissPic = 
}   
Return

Как мне теперь составить список из MissPic и вывести его с помощью send ?

5 (изменено: Стас, 2011-10-27 07:30:49)

Re: AHK: ImageSearch и массив

Сделал, может кого-то и заинтересует. Да, не оставлять же не раскрытую тему.

#3::

; 1w:   ; Описание отсутствует из-за не надобности.
; 2w:   ; Описание отсутствует из-за не надобности.

;~ Loop, 2 
;~ { 
   Loop, 7 
    {
        CoordMode Pixel
        ImageSearch, X, Y, 0, 0, %A_ScreenWidth%, %A_ScreenHeight%, test%A_Index%.bmp  ; Новер картинки будет совпадать с номером Loop
        MissPic += 1 ; Считать текущий номер картинки
        if ErrorLevel = 1 
        { 
        ;~     MsgBox Не найдена картинка test%A_Index%.bmp
        ;~     sleep 1000
        ;~     send %MissPic% ; Сообщает какой номер картинки не найден
            arraycount+= 1 ; Создать номер для массива
            array%arraycount% = %MissPic%  ; Дабавить в каждый массив текущий номер картинки
        }
;~         if ErrorLevel = 0
;~         MsgBox Найдено test%A_Index%.bmp
;~         sleep 1000
    } 
    gosub 1w  ; Переключиться в другую программу, как требовалось
    Loop, %arraycount% ` ; Перебрать каждый номер массива
    {
        element := Array%A_Index%  ; Создать кол-во массивов равное кол-ву Loop, %arraycount%
        SetKeyDelay 2000, 30
        send, % Array%A_Index% ; Выыодится результат сразу всех отсутствующих картинок
            SetKeyDelay 0, 0
    }
        gosub 1w ; Возвращяется в исходную программу
    ; очистка
array%arraycount% =
MissPic = 
;~ }   
Return

Если можно, ваши замечания по данному скрипту.

Тестовые картинки (поместить в одну папку со скриптом АНК).
TestPic.rar

Спасибо за подсказку