Что нового

Автоматизация Помощь с написанием скрипта

Unizorgia

Новичок
Сообщения
7
Репутация
0
Доброго времени суток. В общем в чем сложность. Есть Скрипт для отслеживания области экрана и при появлении заданного цвета появление звукового сигнала. Там заданы координаты отслеживаемых точек, необходимо поменять "точки" на область экрана.
Как это верно сделать? Прошуршала форумы и помощник Autoit, к сожалению к решению не пришла.
 

Вложения

  • AutoIt v3 Script (2).au3
    6.8 КБ · Просмотры: 3

Webarion

Осваивающий
Сообщения
135
Репутация
22
Там заданы не точки, а области, но относительно координат отслеживаемого окна и цвет сработки, внутри этих областей:
Код:
Global $iColorWarning = 0xFF0000 ; цвет сработки
   ; .....
    ; координаты контролов в клиентской области окна. Можно узнать через программу Control Viewer
    ; либо координаты мест, которые будут сканироваться. Правила координат области: [Слева, Сверху, Ширина, Высота]
    Global $aPosCtrl1 = [5, 5, 70, 70]
    Global $aPosCtrl2 = [80, 5, 70, 70]
    Global $aPosCtrl3 = [155, 5, 70, 70]
    Global $aPosCtrl4 = [230, 5, 70, 70]
    Global $aPosCtrl5 = [305, 5, 70, 70]
    Global $aPosCtrl6 = [380, 5, 70, 70]

Если вам нужно отслеживать на экране, а не в окне, удалите строку: AutoItSetOption("PixelCoordMode", 2) и в строке 87, из PixelSearch удалите $hFormColorGen
Задайте нужные экранные координаты и цвет сработки.
 
Последнее редактирование:
Автор
U

Unizorgia

Новичок
Сообщения
7
Репутация
0
Там заданы области относительно отслеживаемого окна и цвет сработки:
Код:
Global $iColorWarning = 0xFF0000 ; цвет сработки
   ; .....
    ; координаты контролов в клиентской области окна. Можно узнать через программу Control Viewer
    ; либо координаты мест, которые будут сканироваться. Правила координат области: [Слева, Сверху, Ширина, Высота]
    Global $aPosCtrl1 = [5, 5, 70, 70]
    Global $aPosCtrl2 = [80, 5, 70, 70]
    Global $aPosCtrl3 = [155, 5, 70, 70]
    Global $aPosCtrl4 = [230, 5, 70, 70]
    Global $aPosCtrl5 = [305, 5, 70, 70]
    Global $aPosCtrl6 = [380, 5, 70, 70]

Если вам нужно отслеживать на экране, а не в окне, удалите строку: AutoItSetOption("PixelCoordMode", 2) и в строке 87, из PixelSearch удалите $hFormColorGen
Задайте нужные экранные координаты и цвет сработки.

Да это я уже и сама поняла, А как обозначается именно область, Пишется так же Global $aPosCtrl ? Или используется другое выражение? Этого я к сожалению не нашла. Понятно что эту область можно выявить через ControlViewer
Сообщение автоматически объединено:

Или к примеру я могу сразу задать необходимый размер по типу 0,0,360,1920 ?
 
Последнее редактирование:

Webarion

Осваивающий
Сообщения
135
Репутация
22
Этот пример был создан под конкретный запрос человека, поэтому и логика у него соответствующая. Данный скрипт ищет только один пиксель определённого цвета, в заданных областях.
Но, если брать именно его:
Сначала задайте, количество отслеживаемых областей в $iControls (строка 35), далее, по количеству, заданному в этой переменной, вы можете создать массивы с пронумерованными именами:
$aPosCtrl1 = ...
$aPosCtrl2 = ...

...
$aPosCtrlN = ... - здесь N, это номер последней области, соответствует числу в $iControls. Эти массивы будут автоматически подхватываться, сколько бы вы их не создали, главное нумеруйте по порядку. Каждый такой массив соответствует одной области [Слева, Сверху, Ширина, Высота]
Например, если нужно отслеживать только две области, то выглядеть будет так:
Код:
Global $iControls = 2
   ; .........
    Global $aPosCtrl1 = [100, 50, 32, 32]   ; тут задайте свои координаты и размеры X,Y,W,H
    Global $aPosCtrl2 = [300, 150, 25, 33] ; и тут, и так далее...


Или к примеру я могу сразу задать необходимый размер по типу 0,0,360,1920 ?
Можете. Но это будет долго. PixelSearch, будет постоянно искать заданный вами цвет пикселя, в очень большой области 360x1920 и хорошо, если он найдёт его в начале, иначе это расточительно. К тому же, чем больше область, тем более вероятнее ошибки срабатывания. Здесь также многое зависит от разнообразия цветов в отслеживаемой области. Чем меньше область и чем чётче заданные параметры, тем стабильнее обнаружение. Изучите спецификацию функции PixelSearch, чтобы настроить её под свою задачу.
 
Последнее редактирование:
Автор
U

Unizorgia

Новичок
Сообщения
7
Репутация
0
А какой лучше размер области использовать, что бы не перегружать скрипт? Поле 360Х1920 поделить на несколько секторов к примеру на 6, и сектора 360Х320 будут стабильно работать?
Сообщение автоматически объединено:

И ещё вопрос, окно, появляющееся по верх всех окон при срабатывании скрипта, можно ли его убрать?
Сообщение автоматически объединено:

А, всё, всё получилось, все работает!) Спасибо большое за помощь)
 
Последнее редактирование:

Webarion

Осваивающий
Сообщения
135
Репутация
22
А какой лучше размер области использовать, что бы не перегружать скрипт?
Зависит от того, что отслеживается. Я бы использовал, на сколько возможно, наименьшие размеры областей, определив в них характерные пиксели.
 
Автор
U

Unizorgia

Новичок
Сообщения
7
Репутация
0
Зависит от того, что отслеживается. Я бы использовал, на сколько возможно, наименьшие размеры областей, определив в них характерные пиксели.
Вообще нужно было отслеживать появление красных точек в окнах другой программы, было принято решение разделить область как раз на количество этих окон, но вот периодически окно оповещения все таки выпрыгивает. Окна 75 на 400 вышли
А так вот под эти окна делала).
 

Вложения

  • изображение_2021-06-30_133132.png
    изображение_2021-06-30_133132.png
    761.8 КБ · Просмотры: 8

Webarion

Осваивающий
Сообщения
135
Репутация
22
Если точка, которую нужно обнаружить статична и не двигается, то и задавайте небольшую область вокруг неё. Если это окно, его можно попробовать обнаружить по классу, через WinExists, или WinWait и уже внутри окна определять область( в этом случае AutoItSetOption и $hFormColorGen нужно будет вернуть назад)
 
Автор
U

Unizorgia

Новичок
Сообщения
7
Репутация
0
К сожалению пиксели мигающие, и тестирование показало что скорость срабатывания звукового сигнала примерно через 5-7 секунд, после появления точки, как можно уменьшить это время?
 

Webarion

Осваивающий
Сообщения
135
Репутация
22
К сожалению пиксели мигающие, и тестирование показало что скорость срабатывания звукового сигнала примерно через 5-7 секунд, после появления точки, как можно уменьшить это время?
Покажите хороший скриншот где есть пиксели, которые нужно поймать.
Учитывайте, что логика срабатывания в этом скрипте следующая:
звуковой сигнал появляется только после появления первой метки, если она не исчезла и в этот момент появились другие метки, сигнал не будет воспроизведён. Сигнал появится снова, только после исчезновения всех меток и если потом, снова появится хотя бы одна.
Возможно, вам стоит посмотреть в сторону реализации через PixelGetColor
 
Последнее редактирование:
Автор
U

Unizorgia

Новичок
Сообщения
7
Репутация
0
Покажите хороший скриншот где есть пиксели, которые нужно поймать.
Учитывайте, что логика срабатывания в этом скрипте следующая:
звуковой сигнал появляется только после появления первой метки, если она не исчезла и в этот момент появились другие метки, сигнал не будет воспроизведён. Сигнал появится снова, только после исчезновения всех меток и если потом, снова появится хотя бы одна.
Возможно, вам стоит посмотреть в сторону реализации через PixelGetColor
Вот примерно так они мигают, через затухание.
 

Вложения

  • изображение_2021-07-02_143006.png
    изображение_2021-07-02_143006.png
    19.1 КБ · Просмотры: 4

Webarion

Осваивающий
Сообщения
135
Репутация
22
Вот и пробуйте задавать эти минимальные области (скриншоты ниже). Определите цвет индикатора в непрозрачном состоянии и задайте его. Возможно стоит использовать отклонения цвета, shade-variation в PixelSearch.
Сообщение автоматически объединено:

Скрипт, чтобы узнать координаты и размеры области на экране:
Код:
#include <WindowsConstants.au3>
#include <Misc.au3>
#include <WinApi.au3>
; Выделите область, чтобы просмотреть её координаты и размеры
; ESC для выхода
Global $iX1, $iY1, $iX2, $iY2
While 1
    ToolTip(_Rect())
    Sleep(1000)
WEnd
Func _Rect()
    Local $aMouse_Pos, $hMask, $hMaster_Mask, $iTemp
    Local $UserDLL = DllOpen("user32.dll")
    $hCross_GUI = GUICreate("Test", @DesktopWidth, @DesktopHeight - 20, 0, 0, $WS_POPUP, $WS_EX_TOPMOST)
    WinSetTrans($hCross_GUI, "", 8)
    GUISetState(@SW_SHOW, $hCross_GUI)
    GUISetCursor(3, 1, $hCross_GUI)
    Global $hRectangle_GUI = GUICreate("", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP, $WS_EX_TOOLWINDOW + $WS_EX_TOPMOST)
    GUISetBkColor(0xFF0000)
    While Not _IsPressed("01", $UserDLL)
        If _IsPressed("1B", $UserDLL) Then Exit
        ToolTip("Выделите область" & @CRLF & "ESC - выход")
        Sleep(50)
    WEnd
    $aMouse_Pos = MouseGetPos()
    $iX1 = $aMouse_Pos[0] - 1
    $iY1 = $aMouse_Pos[1] - 1
    Local $iX, $iY, $iW, $iH
    While _IsPressed("01", $UserDLL)
        $aMouse_Pos = MouseGetPos()
        $aMouse_Pos[0] -=1
        $aMouse_Pos[1] -=1
        $hMaster_Mask = _WinAPI_CreateRectRgn(0, 0, 0, 0)
        $hMask = _WinAPI_CreateRectRgn($iX1, $aMouse_Pos[1], $aMouse_Pos[0], $aMouse_Pos[1] + 1)
        _WinAPI_CombineRgn($hMaster_Mask, $hMask, $hMaster_Mask, 2)
        _WinAPI_DeleteObject($hMask)
        $hMask = _WinAPI_CreateRectRgn($iX1, $iY1, $iX1 + 1, $aMouse_Pos[1])
        _WinAPI_CombineRgn($hMaster_Mask, $hMask, $hMaster_Mask, 2)
        _WinAPI_DeleteObject($hMask)
        $hMask = _WinAPI_CreateRectRgn($iX1 + 1, $iY1 + 1, $aMouse_Pos[0], $iY1)
        _WinAPI_CombineRgn($hMaster_Mask, $hMask, $hMaster_Mask, 2)
        _WinAPI_DeleteObject($hMask)
        $hMask = _WinAPI_CreateRectRgn($aMouse_Pos[0], $iY1, $aMouse_Pos[0] + 1, $aMouse_Pos[1])
        _WinAPI_CombineRgn($hMaster_Mask, $hMask, $hMaster_Mask, 2)
        _WinAPI_DeleteObject($hMask)
        _WinAPI_SetWindowRgn($hRectangle_GUI, $hMaster_Mask)
        $iX2 = $aMouse_Pos[0]
        $iY2 = $aMouse_Pos[1]
        If $iX2 < $iX1 Then
            $iX = $iX2 + 1
            $iW = $iX1 - $iX2 - 1
        Else
            $iX = $iX1 + 1
            $iW = $iX2 - $iX1 - 1
        EndIf
        If $iY2 < $iY1 Then
            $iY = $iY2 + 1
            $iH = $iY1 - $iY2 - 1
        Else
            $iY = $iY1 + 1
            $iH = $iY2 - $iY1 - 1
        EndIf
        $iW = $iW > 0 ? $iW : 0
        $iH = $iH > 0 ? $iH : 0
        ToolTip("X: " & $iX & @CRLF & "Y: " & $iY & @CRLF & "W: " & $iW & @CRLF & "H: " & $iH)
        If WinGetState($hRectangle_GUI) < 15 Then GUISetState()
        Sleep(10)
    WEnd
    $sCopy = "[" & $iX & ", " & $iY & ", " & $iW & ", " & $iH & "]"
    ClipPut($sCopy)
    Local $sMsg = "Скопировано в буфер обмена [X,Y,W,H]:   " & $sCopy
    ConsoleWrite($sMsg & @CRLF)
    ToolTip($sMsg)
    GUIDelete($hRectangle_GUI)
    GUIDelete($hCross_GUI)
    DllClose($UserDLL)
    Return $sMsg
EndFunc
 

Вложения

  • 12.png
    12.png
    41.3 КБ · Просмотры: 4
  • 15.png
    15.png
    46.5 КБ · Просмотры: 3
Последнее редактирование:
Верх