Что нового

Помогите отловить плавающую ошибку (BmpSearch.au3)

Aleks

Новичок
Сообщения
6
Репутация
0
Пред история: Понадобилось сделать кликер...
Есть программа, в которой работает пользователь, и задача у него формировать отчеты по куче позиций.
Алгоритм - поиск фрагмента изображения, далее выбор и затем нажать кнопку "сформировать отчет" дождаться его формирования (на экране всплывает уведомление, держится пару секунд и исчезает). В общем - программа работает до тех пор, пока не нажимаешь сформировать отчет. Прогонял ее без отчета - прокликивает все менюшки, подставляет все нужные значения, но как только включаю формирование отчетов - ожидает появления уведомления (уведомлениеможет появиться и через 5 секунд и через 5 минут в зависимости от объема выборки и загрузки канала связи) и прождав 115 - 120 секунд вылетатет с ошибкой:
BmpSearch.au3 (31) :==> Variable must be of type "Object".
Local $iRowInc = ($tSizeSource.X - $tSizeFind.X) * 4
Local $iRowInc = ($tSizeSource^ ERROR

Для контроля уже и счетчик поставил, ошибка появляется всегда (6 раз прогонял) на 244 вызове процедуры поиска и всегда ругается на эту переменную. Поправил код процедуры каждый раз перед присвоением выводя на консоль текущий порядковый номер вызова процедуры поиска, и значение переменных... Так вот во всех случаях переменная $tSizeSource.X возвращает текущее разрешение экрана по оси Х (1920). При 244 вызове ругается уже в точке вывода переменной на консоль. То есть получается при 244 вызове в переменную попадает какая то хрень возвращаемая процедурой _WinAPI_GetBitmapDimension($hSource). Переменная $hSource при вызове всегда разная, не думаю, что проблема в ней. Можно конечно перелопатить BmpSearch.au3 включив его в программу, и вызывать функцию _WinAPI_GetBitmapDimension($hSource) один раз за запуск - сохраняя значение разрешения экрана, но как то это не правильно. Функция должна выполняться каждый раз возвращая стабильное значение, если на 244 раз она выдает хрень - нужно править функцию.
Если кто сталкивался - как победили?

***
Добавлю к грехам функции...
Начиная с 117 вызова функция возвращает странные значения найденных координат картинки.
Например координаты в 116 запуске поиска возвращаются координаты 990х187, в 117 запуске поиска той же картинки координаты уже 94х559428
При попытке поставить курсор на данную область - он улетает к верхней границе экрана, и там выполняется клик.
Буду пробовать BmpSearchEx.
 
Последнее редактирование:

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
нужно править функцию
Попробуйте модифицированный вариант
 
Автор
A

Aleks

Новичок
Сообщения
6
Репутация
0
Попробуйте модифицированный вариант
Благодарю за ответ.
Проверил функцию. Запустил на пустом примере, начались проблемы примерно после 200 запуска с координатами. Обрадовался, в этом случае скорее всего удалось бы обойтись малой кровью, но нет. При запуске полного варианта программы с отключенным блоком контроля всплывающего окна - снова на 117 пункте координаты улетели за пол миллиона. Хоть вроде прога и не выскочила по ошибке, но я и до 160 запуска не добрался, программа закончила работу. Так что если эта функция и работает - не намного лучше. Нужно другое решение.

А по вышеуказанной "багованной" функции - ошибка не позволяющая ею пользоваться возникает на 117 вызове, далее - работает тольо факт наличия или отсутствия на экране изображения работает. Единственный вариант ее использования в моей задаче - прокликать все возможные точки сохраняя координаты искомых фрагментов в разных менюшках, и потом используя другую функцию вроде PixelSearch для контроля всплывания окна и прогрузки меню. Но всегда есть "но"... Никаких гарантий, что нужные функции проработают минимум 200 - 500 циклов, снова танцы с бубном при создании скрипта. С функцией BmpSearch.au3 уже все отработано, от нее требуется только стабильно работать от 400 до 2000 циклов запуска.
Ну или разбивать срипт на задачи, делая десяток исполняемых модулей, которые будут запускаться последовательно, что тоже далеко от соответствия требований руководства.
 
Последнее редактирование:

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
пример работающий с этой функцией, но с картинками из файлов
Код:
#pragma compile(x64, false)
#AutoIt3Wrapper_UseX64=N

#include <ScreenCapture.au3>

$sPath = @ScriptDir & "\test.png" ; путь к файлу
$hBmp = _ScreenCapture_Capture() ; снимок рабочего стола
; _ScreenCapture_SaveImage("scr.png", $hBmp, False) ; отладка
$aCoords = _BmpSearchEx($hBmp, $sPath, 1) ; поиск
If Not @error Then ; ошибки нет
  If $aCoords[0][0] Then ; найдено
    ConsoleWrite($aCoords[1][2] & ":" & $aCoords[1][3] & @CRLF) ; координаты
  Else
    ConsoleWrite("not found" & @CRLF) ; не найдено
  EndIf
Else
  ConsoleWrite("error: " & @error & @CRLF) ; номер ошибки
EndIf
_WinAPI_DeleteObject($hBmp) ; удаление снимка

Файл с картинкой обычно не меняется. Поэтому для поиска в цикле лучше делать так
Код:
#include <ScreenCapture.au3>

_GDIPlus_Startup()
$sPath = @ScriptDir & "\test.png"
$hImg = _GDIPlus_BitmapCreateFromFile($sPath)
For $i = 1 To 1000
  ConsoleWrite($i & " ")
  $hBmp = _ScreenCapture_Capture()
  $aCoords = _BmpSearchEx($hBmp, $hImg, 1)
  If Not @error Then
    If $aCoords[0][0] Then
      ConsoleWrite($aCoords[1][2] & ":" & $aCoords[1][3] & @CRLF)
    Else
      ConsoleWrite("not found" & @CRLF)
    EndIf
  Else
    ConsoleWrite("error: " & @error & @CRLF)
  EndIf
  _WinAPI_DeleteObject($hBmp)
Next
_GDIPlus_BitmapDispose($hImg)
_GDIPlus_Shutdown()

Если время поиска не критично, можете попробовать эту функцию
 
Автор
A

Aleks

Новичок
Сообщения
6
Репутация
0
Код:
#pragma compile(x64, false)
#AutoIt3Wrapper_UseX64=N

#include <ScreenCapture.au3>

$sPath = @ScriptDir & "\test.png" ; путь к файлу
$hBmp = _ScreenCapture_Capture() ; снимок рабочего стола
; _ScreenCapture_SaveImage("scr.png", $hBmp, False) ; отладка
$aCoords = _BmpSearchEx($hBmp, $sPath, 1) ; поиск
If Not @error Then ; ошибки нет
  If $aCoords[0][0] Then ; найдено
    ConsoleWrite($aCoords[1][2] & ":" & $aCoords[1][3] & @CRLF) ; координаты
  Else
    ConsoleWrite("not found" & @CRLF) ; не найдено
  EndIf
Else
  ConsoleWrite("error: " & @error & @CRLF) ; номер ошибки
EndIf
_WinAPI_DeleteObject($hBmp) ; удаление снимка

Файл с картинкой обычно не меняется. Поэтому для поиска в цикле лучше делать так
Код:
#include <ScreenCapture.au3>

_GDIPlus_Startup()
$sPath = @ScriptDir & "\test.png"
$hImg = _GDIPlus_BitmapCreateFromFile($sPath)
For $i = 1 To 1000
  ConsoleWrite($i & " ")
  $hBmp = _ScreenCapture_Capture()
  $aCoords = _BmpSearchEx($hBmp, $hImg, 1)
  If Not @error Then
    If $aCoords[0][0] Then
      ConsoleWrite($aCoords[1][2] & ":" & $aCoords[1][3] & @CRLF)
    Else
      ConsoleWrite("not found" & @CRLF)
    EndIf
  Else
    ConsoleWrite("error: " & @error & @CRLF)
  EndIf
  _WinAPI_DeleteObject($hBmp)
Next
_GDIPlus_BitmapDispose($hImg)
_GDIPlus_Shutdown()

Если время поиска не критично, можете попробовать эту функцию
Благодарю!!!
Проблема решена. Обошелся процедурой _PicInPic. Время работы не критично, да и не заметил я особого замедления. Программа отработала весь цикл создания отчетов, было в этот раз более 300 вызовов процедуры поиска, с координатами и со стабильностью все прошло без замечаний.
Спасибо!!!
 
Последнее редактирование:
Верх