1 (изменено: ANTONIO, 2024-02-25 01:51:55)

Тема: AHK: Поиск по экрану

Доброго времени суток.
Я в ahk не очень силен, даже наверное слаб.Я написал код и подробно расписал его, насколько смог, чтобы он был понятен. Проблема заключается в том, что клик по фото происходит в верхнем левом углу, а не в центре. Также требуется двойной клик, начиная со вторых координат.

Вот целый код:


#Persistent

F2:: ; При нажатии на F2 анализирует экран и находит изображения
    AnalyzeScreen()
return

F3:: ; При нажатии на F3 выполняет клики по ранее найденным изображениям
    ClickSavedImages()
return

AnalyzeScreen() {
    ; Создаем или очищаем файл .ini для записи координат
    FileDelete, C:\Users\Влад\Desktop\td\ImageCoordinates.ini
    ; Проходим по всем изображениям от number_1.jpg до number_20.jpg
    Loop, 20 {
        ; Формируем путь к текущему изображению
        currentImagePath := "C:\Users\Влад\Desktop\td\number_" . A_Index . ".jpg"
        ; Ищем изображение на экране
        ImageSearch, FoundX, FoundY, 0, 0, A_ScreenWidth, A_ScreenHeight, *50 %currentImagePath%
        ; Если изображение найдено, записываем его координаты в файл .ini
        if !ErrorLevel {
            Coord := FoundX "," FoundY
            FileAppend, %Coord%`n, C:\Users\Влад\Desktop\td\ImageCoordinates.ini
        }
    }
}

ClickSavedImages() {
    ; Открываем файл .ini для чтения координат
    FileRead, Coord, C:\Users\Влад\Desktop\td\ImageCoordinates.ini
    ; Проходим по строкам файла
    Loop, Parse, Coord, `n
    {
        ; Разделяем строку на координаты
        CoordArray := StrSplit(A_LoopField, ",")
        ClickX := CoordArray[1]
        ClickY := CoordArray[2]
        MouseClick, Left, %ClickX%, %ClickY%, 2 ; клик левой кнопкой мыши
        Sleep, 1000
    }
}

Идея кода заключается в том, что при анализе экрана он найдет на нем 20 различных фотографий и уже затем запишет их координаты в файл .ini. Затем он будет последовательно кликать на эти координаты на экране.

2 (изменено: __Михаил__, 2024-02-25 02:13:37)

Re: AHK: Поиск по экрану

Команда 'ImageSearch' при нахождении записывает координаты слева-сверху. Если нужен клик в центр картинки - нужно заранее узнать размеры. Для этого открыть картинку, прочесть размеры, записать в переменные. Но лучше записать один раз в скрипт и не париться с этим.
Для двойного клика нужно делать проверку итерации в цикле, иначе АХК не сможешь узнать когда ему нужно делать 1 или 2 клика.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

3

Re: AHK: Поиск по экрану

__Михаил__
Я попробовал вчера немного изменить подход. Вместо того, чтобы центрировать изображение, я просто записал данные об отдалении в пикселях и сделал двойной щелчок мышью для инициализации. Однако теперь возникла проблема: при нажатии F3 один раз он нажимает только четыре координаты, а затем останавливается. При повторном нажатии на F3 он уже нажимает до десяти координат, иногда до шестнадцати. Не понимаю, почему сначала не все сразу, а затем почему вообще не до конца считывает.


#Persistent

F2::
    AnalyzeScreen()
return

F3:: 
    ClickSavedImages()
return

AnalyzeScreen() {
   
    FileDelete, C:\Users\Влад\Desktop\td\ImageCoordinates.ini
  
    Loop, 20 {
     
        currentImagePath := "C:\Users\Влад\Desktop\td\number_" . A_Index . ".jpg"
       
        ImageSearch, FoundX, FoundY, 0, 0, A_ScreenWidth, A_ScreenHeight, *50 %currentImagePath%
       
        if !ErrorLevel {
         
            FoundX += 15
            FoundY += 10
            Coord := FoundX "," FoundY
            ; Если это первая или последняя координата, записываем ее один раз
            if (A_Index = 1 or A_Index = 20) {
                FileAppend, %Coord%`n, C:\Users\Влад\Desktop\td\ImageCoordinates.ini
            } else {
                ; В противном случае записываем координату дважды
                FileAppend, %Coord%`n%Coord%`n, C:\Users\Влад\Desktop\td\ImageCoordinates.ini
            }
        }
    }
}

ClickSavedImages() {

    FileRead, Coord, C:\Users\Влад\Desktop\td\ImageCoordinates.ini
   
    Loop, Parse, Coord, `n
    {
        ; Разделяем строку на координаты
        CoordArray := StrSplit(A_LoopField, ",")
        ClickX := CoordArray[1]
        ClickY := CoordArray[2]
        ; Кликаем по каждой координате
        MouseClick, Left, %ClickX%, %ClickY%
        Sleep, 700 
    }
}

4 (изменено: __Михаил__, 2024-02-25 22:21:48)

Re: AHK: Поиск по экрану

ANTONIO
Проверьте этот код:


SetBatchLines,-1
CoordMode, Pixel, Screen
CoordMode, Mouse, Screen
SetDefaultMouseSpeed, 0

Global Path := "C:\Users\Влад\Desktop\td\"	; Путь к папке.
Global Ini := Path "ImageCoordinates.ini"		; Путь +название файл настроек.
Global Coord := 0
Return

F2:: AnalyzeScreen()	; F2 поиск картинок, запись координат +размера картинки.
F3:: ClickSavedImages()	; F3 выполняет клики.

AnalyzeScreen(){
 FileDelete, % Ini
 Coord := ""
 Loop, 20{
  Img := Path "number_" A_Index ".jpg"
  Img_Size(Width, Height, Img)	; Определить размеры.
  ImageSearch, FoundX, FoundY, 0, 0, A_ScreenWidth, A_ScreenHeight, % "*50 " Img
  If (ErrorLevel = 0)
   Coord .= FoundX "," FoundY "," Width "," Height "`n"
  Else
   Coord .= "None`n"	; Нет позиции.
 }
 FileAppend, % Coord := RTrim(Coord, "`n"), % Ini	; Запись данных в файл и в переменную.
 MsgBox, 0, Поиск картинок, Координаты сохранены, 1	; Уведомление можно убрать если мешает.
}


ClickSavedImages(){
 If (Coord = 0)		; Если координат нет - прочесть файл.
  FileRead, Coord, % Ini
 Loop, Parse, Coord, `n, `r	; '`r' для игнорирования символа переноса каретки.
 {
  If !(A_LoopField = "None"){	; Данных нет - пропускаем.
   Pos := StrSplit(A_LoopField, ",")	; Разделить по запятой.
   Click, % Pos.1 + (Pos.3 // 2) " " Pos.2 + (Pos.4 // 2) " " (A_Index > 1 And A_Index < 20 ? 2:1)	; Позиция +смещение +клик (1 или 2 раза учитываем).
   Sleep, 700
  }
 }
}

;[Malcev] 28.12.2012 21:16:25	https://forum.script-coding.com/viewtopic.php?pid=67981#p67981
Img_Size(ByRef Width, ByRef Height, Img){
 Gui, Add, Picture, hwndMyPic, % Img
 ControlGetPos,,, Width, Height,, ahk_id %MyPic%
 Return [Width, Height]
}
Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

5

Re: AHK: Поиск по экрану

__Михаил__
Добрый день! Я попробовал и да, оно работает, но при работе есть один минус: оно кликает один раз, а нужно было два раза, начиная со второй точки и до девятнадцатой включительно (на первой и двадцатой точках по одному нажатию). И второе, после нажатия F2 координаты сохраняются в течение примерно 15 секунд. Можно ли это время как-то сократить?

6 (изменено: __Михаил__, 2024-02-25 22:24:44)

Re: AHK: Поиск по экрану

ANTONIO
Быстрее сохранять не выйдет если картинки большие, комп слабый, зона поиска - весь экран ещё и *50 точность поиска.
Подправил код (1 и 20 клик по одному клику, остальные по 2).
Я для поиска использую малые .png картинки ~20 пикселей макс. Сохранение менее чем за секунду.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

7 (изменено: ANTONIO, 2024-02-26 02:12:30)

Re: AHK: Поиск по экрану

__Михаил__
Большое спасибо за помощь в моем обучении. У меня получилось сделать самому, и вот что у меня получилось.

#Persistent

F2:: ; При нажатии на F2 анализирует экран и находит изображения
    AnalyzeScreen()
return

F3:: ; При нажатии на F3 выполняет клики по ранее найденным изображениям
    ClickSavedImages()
return

AnalyzeScreen() {
    ; Создаем или очищаем файл .ini для записи координат
    FileDelete, C:\Users\Влад\Desktop\td\ImageCoordinates.ini
    ; Проходим по всем изображениям от number_1.jpg до number_20.jpg
    Loop, 20 {
        ; Формируем путь к текущему изображению
        currentImagePath := "C:\Users\Влад\Desktop\td\number_" . A_Index . ".jpg"
        ; Ищем изображение на экране
        ImageSearch, FoundX, FoundY, 0, 0, A_ScreenWidth, A_ScreenHeight, *50 %currentImagePath%
        ; Если изображение найдено, записываем его координаты в файл .ini
        if !ErrorLevel {
            ; Добавляем смещение +15 к координатам X и +10 к Y
            FoundX += 15
            FoundY += 10
            Coord := FoundX "," FoundY
            ; Записываем координаты в файл .ini
            if (A_Index = 1 or A_Index = 20) {
                FileAppend, %Coord%`n, C:\Users\Влад\Desktop\td\ImageCoordinates.ini
            } else {
                FileAppend, %Coord%`n%Coord%`n, C:\Users\Влад\Desktop\td\ImageCoordinates.ini
            }
        }
    }
}
!ErrorLevel
ClickSavedImages() {
    ; Открываем файл .ini для чтения координат
    FileRead, Coord, C:\Users\Влад\Desktop\td\ImageCoordinates.ini
    ; Проходим по строкам файла
    Loop, Parse, Coord, `n
    {
        ; Разделяем строку на координаты
        CoordArray := StrSplit(A_LoopField, ",")
        ClickX := CoordArray[1]
        ClickY := CoordArray[2]
        ; Кликаем по каждой координате
        if (A_Index = 1 or A_Index = 20){    ;1 и 20 нажатие только 1 раз
             MouseClick, Left, %ClickX%, %ClickY%
        Sleep, 700 ; Пауза между кликами
        }
         else{
        MouseClick, Left, %ClickX%, %ClickY%
        Sleep, 700 ; Пауза между кликами
        ; Если это не последняя координата, кликаем еще раз
        if (A_Index < CoordArray.MaxIndex()) {
            MouseClick, Left, %ClickX%, %ClickY%
            Sleep, 700 ; Пауза между кликами
        }
        }
    }
}

Ещё я пытаюсь написать код для поиска пикселя с возможностью изменения его цвета и положения. И у меня возник вопрос: если я создам тему по этому вопросу, смогу ли я получить поддержку от вас или кого-то ещё? Я имею в виду именно поддержку в идеях, а не просто коде, так как из простого кода я мало чему научусь и не смогу продвигаться дальше.