Что нового

[Автоматизация] Нахождение координат пикселя по цвету и нажатие мышкой в неактивном окне

Сообщения
137
Репутация
-2
Задача: определение координат пикселя заданного цвета в неактивном окне, возврат координат и кликанье по ним мышкой.
У меня в активном получается, в неактивном нет, вот код:

Код:
Opt("WinTitleMatchMode",2)
$hWnd = WinWait("Site page as example - Maxthon")

$coord = PixelSearch(1195, 195, 1273, 233, 0xE1A014) ;здесь координаты >>>> Mouse <<<< Position
;ToolTip ($coord[0] & " " & $coord[1] ) ; не работает тултип этот, хотя не плохо было б,чтоб он показывал координаты цвета пикселя в трее правого нижнего угла.
If Not @error Then

  ; MsgBox(0, "X и Y равны:", $coord[0] & "," & $coord[1]); - работает, но абсолютно в коде лишнее)
$p=$coord[0] - 49 ; подгоняю координаты х как для ControlClick Coords
$q=$coord[1] - 89 ; подгоняю координаты y как для ControlClick Coords

ControlClick($hWnd, "", "Mx_WidgetWin_03", "left", 1, $p, $q) ; здесь работает только с координатами ControlClick Coords
; как красиво перевести координаты из  >>>> Mouse <<<< Position в ControlClick Coords не знаю, как они правильно называются тоже не знаю
 EndIf


Код, конечно, примитивно написан...но я только учусь.
Подскажите, что тут исправить для отработки в неактивном окне
 
A

Alofa

Гость
Код:
Opt("WinTitleMatchMode",2)
Opt("PixelCoordMode", 2)

$hWnd = WinWait("Site page as example - Maxthon")
$aClientSize = WinGetClientSize($hWnd)

$coord = PixelSearch(0, 0, $aClientSize[0], $aClientSize[1], 0xE1A014, 0, 1, $hWnd)
If Not @error Then ; ...

(Проверить не могу, проверяйте сами)
 
Автор
D
Сообщения
137
Репутация
-2
Спасибо большое за скрипт, но,к сожалению, работает так же как и мой вариант - на требуемый пиксель кликает только если этот пиксель хоть как-то но виден. А мне нужно, чтоб кликал, когда нужное окно находится за другими окнами. То есть оно не свёрнуто, а открыто как бы на заднем плане.


Добавлено:
Сообщение автоматически объединено:

Кстати, вопрос:
Код:
Opt("WinTitleMatchMode",2)
Opt("PixelCoordMode", 2) ; отсчет координат пикселей относительно координат клиентской области указанного окна

$hWnd = WinWait("Site page as example - Maxthon")
$aClientSize = WinGetClientSize($hWnd) ; определение координат клиентской области указанного окна

$coord = PixelSearch(0, 0, $aClientSize[0], $aClientSize[1], 0xE1A014, 0, 1, $hWnd); для чего мы начинаем искать пиксели с 0:0 координат левого верхнего угла экрана и до...координат клиентской части окна? А после цвета цифры 0 -без градиента цвета, а
;1 - шаг пикселя (лучше использовать значение 2 (так в справке написано))
;Теперь я не понимаю как эта строка ищет координаты нашего пикселя...
If Not @error Then
   $p=$coord[0] - 49
   $q=$coord[1] - 89
   ControlClick($hWnd, "", "Mx_WidgetWin_03", "left", 1, $p, $q)
EndIf

Alofa сказал(а):
(Проверить не могу, проверяйте сами)
 
Автор
D
Сообщения
137
Репутация
-2
Ну, прочитал, посмотрел,красиво,молодцы...несколько гуру программирования общаются между собой, дорабатывая код своими двумя строчками, понятными только опытным "скриптописателям" и никто больше не влазит в их обсуждение...причём окончательного результата так и нет. Нет предела совершенству, видимо. Ещё в интернете почитал кучу примеров по нахождению одного пикселя, всех пикселей, пикселей с градиентом...массивы, возврат из DLL...никаких объяснений нет(( А про клик мышки в найденных координатах указанного пикселя вообще ничего не пишется. Функции _PixelGetArray вообще не существует в AutoIt Help, а поиск в интернете указывает на этот форум исключительно. Что она конкретно делает я так и не понял. На форуме этом поиск не работает...
А пиксель я прекрасно нахожу, чудесно в MsgBox получаю его координаты.Как мне их мышке передать...
Код:
ControlClick($hWnd, "", "Mx_WidgetWin_01", "left", 1,$coord[0],$coord[1])
не подходит, т.к. не кликает в перекрытой (не активном) окне
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
Dessan
причём окончательного результата так и нет
Неправда. Он там есть. Просто, если вы не понимаете о чём идёт речь, естественно вы не сможете отличить обсуждение от результата.

Функции _PixelGetArray вообще не существует
Именно! Этакий эксклюзивчик данного форума.

Что она конкретно делает я так и не понял
Функция похожа на PixelSearch(), только медленная и не умеет искать оттенки, но работает с перекрытыми окнами и с возможностью поиска сразу массива пикселей.

получаю его координаты
Координаты бывают разные: относительно экрана, относительно окна, относительно рабочей области, относительно элемента (контрола). Когда вы научитесь их различать - вопрос о передаче в ControlClick (т.е. относительно элемента) отпадёт.

не кликает в перекрытом (не активном) окне
Не кликает на любой странице или на конкретной? А если окно сделать активным - тоже не кликает?

Между прочим, активное окно тоже может быть перекрыто окном с атрибутом "поверх всех окон".
 
Автор
D
Сообщения
137
Репутация
-2
Согласен, чтоб понимать о чём ведут речь опытные программисты, нужно хотябы пол годика пописать какие-то свои коды и почитать много литературы. Хотелось бы просто, чтоб было чуть больше пояснений.

По поводу работы скрипты, как мне казалось, я всё подробно описал.

Вот мой код:

Код:
#include <Constants.au3> ; понятия не имею какие нужны инклюды, до их вариаций я ещё не дошёл
Opt("WinTitleMatchMode",2)
$hWnd = WinWait("Site page as example - Maxthon")

$coord = PixelSearch(1195, 195, 1273, 233, 0xE1A014) ;здесь координаты >>>> Mouse <<<< Position (относительно экрана)

If Not @error Then
;ToolTip ("Это текст заголовка", "Кнопка нажата", $coord[0] & " " & $coord[1] ) ; не работает тултип этот, хотя не плохо было б,чтоб он показывал координаты цвета и текст "Кнопка нажата"
  ; MsgBox(0, "X и Y равны:", $coord[0] & "," & $coord[1]); - работает, но абсолютно в коде лишнее), 'это я проверял правильные координаты цвета выдаёт или нет.
$p=$coord[0] - 49 ; подгоняю координаты х как для ControlClick Coords (уже координаты внутри окна браузера)
$q=$coord[1] - 89 ; подгоняю координаты y как для ControlClick Coords (уже координаты внутри окна браузера)

ControlClick($hWnd, "", "Mx_WidgetWin_03", "left", 1, $p, $q) ; здесь работает только с координатами ControlClick Coords
; как красиво перевести координаты из  >>>> Mouse <<<< Position в ControlClick Coords не знаю и как они правильно называются тоже не знаю
 EndIf


Описание :на странице браузера появляется кнопка с уникальными цветами пикселей 0xE1A014 и смежных от жёлтого к золотому. Как только это происходит - на неё нужно нажимать. Кнопка всегда в одном и том же месте.
С активным окном браузера этот скрипт прекрасно работает, но как только область нахождения кнопки чем-то перекрыть (даже окном скрипта ) - она не нажимается. Но если подключить MsgBox,посмотреть какие координаты он показывает и вписать их вручную , например:
Код:
ControlClick($hWnd, "", "Mx_WidgetWin_03", "left", 1, 1123, 210)
то всё работает даже с перекрытым окном и свёрнутым. Как автоматически передать координаты пикселя не знаю.

Кроме того не совсем удобно каждый раз менять номер Mx_WidgetWin этого Maxthon, хотя он мне даже нравится.

Я уже думал передавать координаты в блокнот например, а потом от туда их вписывать в код какой-то функцией, но это либо слишком сложно для меня, либо просто бредовая идея вообще.

P.S. Где взять инклюд с _PixelGetArray и в каком месте сохранять инклюды, чтоб они потом подключались нормально...
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
Dessan
хотябы пол годика
Я несколько лет изучаю AutoIt и до сих пор не считаю себя программистом.

как мне казалось
Правильно. Это только так кажется.

понятия не имею какие нужны
Вот именно от таких фраз пропадает всякое желание помогать. Если вы не хотите понимать, то зачем мне вам объяснять?

как только область нахождения кнопки чем-то перекрыть
PixelSearch() работает ТОЛЬКО с экраном. Если вы ГЛАЗАМИ видите эту область, то и она её увидит. В противном случае - ошибка поиска.

Как автоматически передать координаты пикселя не знаю
Нет в AutoIt штатных функций работы с перекрытым окном. Все работают с ЭКРАНОМ. Чтобы работать с перекрытым или "задвинутым" окном нужно использовать "самописные" функции, c одной из которых вы уже знакомы (_PixelGetArray).

не совсем удобно каждый раз менять номер Mx_WidgetWin этого Maxthon
В соседней теме я вас об этом предупреждал. Раньше я данный браузер рекомендовал, теперь не буду. С другой стороны, единственная вкладка всегда будет "Mx_WidgetWin_01".

Где взять инклюд с _PixelGetArray
Мне не известно, чтобы кто-то включил данную функцию в UDF. Следовательно, просто копируете её, вставляете в скрипт и используете.

в каком месте сохранять инклюды, чтоб они потом подключались нормально
Проявите уважение к разработчикам справки - прочтите её. Там это описано очень подробно, т.к. без понимания этого сложно что-то делать. Если вы не знаете о русской версии, то она здесь: Развитие русской справки
 
Автор
D
Сообщения
137
Репутация
-2
Вы мне напоминаете профессоров из моей Академии...Я очень ценю Ваши достижения в AutoIt, я очень ценю Ваш комментарии и особенно я ценю Ваше желание направить меня на изучение и понимание всех аспектов скриптописания, причём из самый добрых побуждений. Но зачем же Вы меня так мучаете? Я уверен там дело максимум в 3 строчках, а то и вообще в 1...Скажите мне эту строчку, тогда я возрадусь, восхищусь Вашими познаниями и это вдохновит меня на дальнейшее углублённое изучение языка AutoIt, а может и не только его. Всё зависит от потребностей...если б я сталкнулся с этим лет 10 назад, когда я играл усиленно в RF Online, я б уже всю справку наизусть знал, ещё б и гильдию подсадил-а у меня их две было вообще и масса свободного времени. А сейчас...ну, не мучайте меня, пожалуйста...дайте код с решением...
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
Dessan
восхищусь Вашими познаниями
Я в этом не нуждаюсь.

дайте код с решением
Стол заказов

Хочу отметить психологически грамотно выстроенную речь. Тройное восхищение, обращение с большой буквы, призыв к сочувствию, обещание поощрения с развитием положительной мотивации, информирование о прошлых достижениях и, акцентом, мольба о помощи. По пол балла снимаю за сравнение с профессорами и за уверенность в непонимании. Итого - твёрдая четвёрка. Если вас никто этому не учил, то вы можете стать хорошим психологом.
 
Автор
D
Сообщения
137
Репутация
-2
Благодарю, профессор, за столь щедрый анализ моей скромной персоны. Другая у меня специальность, знал бы, что на аналитика такого попаду - написал бы по-другому. Хотя, вообще бы не писал ничего. Ладно, получайте удовольствие от своего превосходства в области скриптописания и наслаждение от поучительных нотаций. Делать психолингвистический анализ было не лень, а две строчки написать мы можем,но не хотим. Некрасиво, нетактично,крайне высокомерно, будьте проще




Добавлено:
Сообщение автоматически объединено:

Скачал справку отсюда: http://autoit-script.ru/index.php?topic=10070.390 Полный комплект справки, зеркало 2014.07.09,
установил всё с заменой, запустил и
Код:
 Переход на веб-страницу отменен 
  Попробуйте сделать следующее: 
     Повторите ввод адреса.
что с чёрной, что с белой :-X
Английская работала нормально
 
A

Alofa

Гость
Dessan в Ответ #3 я вам давал вторую ссылку, вы ее вообще смотрели?
Там в архиве даже .chm справка есть. Разжевано все до не могу.
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
Dessan
Ладно, получайте удовольствие <...> и наслаждение <...>
Спасибо, что разрешили, а то я уже переживать начал.

Я уверен там дело максимум в 3 строчках, а то и вообще в 1
Вот код, который вы, лицемеря и унижаясь, выпрашиваете. Почувствуйте себя нищим, выпросившим подаяние, а я некрасиво и нетактично потешу своё высокомерие
Код:
#include <WinAPIGdi.au3>

Opt("WinTitleMatchMode", 2)

; координаты левого верхнего угла области поиска
; используем данные "ControlClick Coords" для контрола "Mx_WidgetWin_0"
$X = 1050
$Y = 85
; ширина и высота области поиска
$Width = 100
$Height = 100
; икомый цвет пикселя
$Color = 0xCDE7FF

; проверка наличия окна
$hWnd = WinGetHandle(" - Maxthon")
If Not $hWnd Then Exit MsgBox(0, "Error", "Не найдено окно Maxthon")

; определяем номер элемента "Mx_WidgetWin_0" текущей вкладки
For $i = 1 To 100
  If ControlCommand($hWnd, "", "Mx_WidgetWin_0" & $i, "IsVisible") Then ExitLoop
Next
; получаем handle элемента
$hCtrl = ControlGetHandle($hWnd, "", "Mx_WidgetWin_0" & $i)

; ищем первый подходящий пиксель
$aPix = _PixelGetArray($X, $Y, $Width, $Height, $Color, $hCtrl, True)
; кликаем по координатам найденного пикселя
If $aPix[0][0] Then ControlClick($hWnd, "", $hCtrl, "left", 1, $aPix[1][0], $aPix[1][1])

; -------------------------------

; функция поиска массива пикселей
; $i_X, $i_Y - координаты левого верхнего угла области поиска
; $i_Width, $i_Height - ширина и высота области поиска
; $i_Color - искомый цвет пикселя
; $h_Wnd - дескриптор окна или элемента, относительно которого осуществляется поиск (0 - на всём экране)
; $f_FirstOnly - если True, то завершает поиск после нахождения первого пикселя
Func _PixelGetArray($i_X, $i_Y, $i_Width, $i_Height, $i_Color, $h_Wnd = 0, $f_FirstOnly = False)
    Local $i_Size = $i_Width * $i_Height, $a_Pixels[$i_Size + 1][2] = [[0]], $h_DC, $h_MemDC, $h_Bitmap, $t_Bits, $i_Index
    $h_DC = _WinAPI_GetDC($h_Wnd)
    $h_MemDC = _WinAPI_CreateCompatibleDC($h_DC)
    $h_Bitmap = _WinAPI_CreateCompatibleBitmap($h_DC, $i_Width, $i_Height)
    _WinAPI_SelectObject($h_MemDC, $h_Bitmap)
    _WinAPI_BitBlt($h_MemDC, 0, 0, $i_Width, $i_Height, $h_DC, $i_X, $i_Y, 0x00CC0020) ; $SRCCOPY
    _WinAPI_DeleteDC($h_MemDC)
    _WinAPI_ReleaseDC($h_Wnd, $h_DC)
    $t_Bits = DllStructCreate('dword[' & $i_Size & ']')
    $p_Bits = DllStructGetPtr($t_Bits)
    _WinAPI_GetBitmapBits($h_Bitmap, 4 * $i_Size, $p_Bits)
    _WinAPI_DeleteObject($h_Bitmap)
    For $i = 0 To $i_Height - 1
        For $j = 0 To $i_Width - 1
            $i_Index += 1
            If BitAND(DllStructGetData($t_Bits, 1, $i_Index), 0x00FFFFFF) = $i_Color Then
                $a_Pixels[0][0] += 1
                $a_Pixels[$a_Pixels[0][0]][0] = $j + $i_X
                $a_Pixels[$a_Pixels[0][0]][1] = $i + $i_Y
                If $f_FirstOnly Then ExitLoop 2
            EndIf
        Next
    Next
    ReDim $a_Pixels[$a_Pixels[0][0] + 1][2]
    Return $a_Pixels
EndFunc   ;==>_PixelGetArray
 
Автор
D
Сообщения
137
Репутация
-2
Вот код, который вы, лицемеря и унижаясь, выпрашиваете. Почувствуйте себя нищим, выпросившим подаяние, а я некрасиво и нетактично потешу своё высокомерие
- каждый интерпретирует в меру испорченности своей личности, а "тщеславие мой самый любимый из грехов" .

Честно признать...не думал, что там такой огромный код. Нет возможности сейчас проверить, но...огромнейшее спасибо! Мне нужно выполнение одного элементарного действия, а такой алгоритм как на целого бота. За пояснительные ремарки отдельная благодарность. Даже если код не отработает - вижу, что искал вообще не в том месте. А на поиски ушла бы уйма времени.



Добавлено:
Сообщение автоматически объединено:

Alofa сказал(а):
Dessan в Ответ #3 я вам давал вторую ссылку, вы ее вообще смотрели?
Там в архиве даже .chm справка есть. Разжевано все до не могу.

Смотрел первую ссылку точно, вторую ссылку Хром не захотел открывать, объясняя опасным содержимым без возможности перейти на эту "опасную страницу". Почитав форум и гуру InnI скачал Maxthon...вот он меня и пустил по ссылке. Справка по FindPixel открылась, буду изучать. Спасибо за помощь
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
Dessan
если код не отработает
Код проверен на десятке сайтов в двух системах - Win7 и Win10. Если он не заработает в конкретной игре, значит либо проверяется активность окна браузера, либо для получения координат клика используется реальное положение курсора мыши, либо используются более продвинутые меры защиты от имитации. Игры ведь тоже не идиоты пишут.
 
Автор
D
Сообщения
137
Репутация
-2
Действительно, работает!Огромное спасибо!Задача выполнена более чем.

OffTopic:
Да, не для игр мне пока что. Хотя, ботоводством никогда не занимался, а вот сейчас интересно стало.


Главная моя ошибка была в том, что я находил функции на этом сайте и не вставлял их в свой код, а начинал изменять, например заменяя ($i_X, $i_Y) кода на свои координаты и вообще вписывал по незнанию свой код внутрь готовой функции, а не наоборот.

Касательно функции _PixelGetArray, не могу теперь ничего найти кроме ссылки:
http://autoit-script.ru/index.php?topic=20430.0.В коде,который написан по моей просьбе, находится исходник функции _PixelGetArray или её изменили под меня?
Скаченная справка на русском так и не запустилась,даже после вызова меню свойств правой кнопкой и нажатия Разблокировать.
 
A

Alofa

Гость
OffTopic:
Dessan сказал(а):
... Скаченная справка на русском так и не запустилась...
Это нонсенс. :Virus:
Скачиваете Полный комплект справки, внутри архива находите файл "Описание.txt" и читаете его. :Rulz:
------------------------ Установка справки ------------------------

1. Файлы из каталога "Examples\Helpfile" скопировать в "C:\Program Files\AutoIt3\Examples\Helpfile" с заменой оригинальных. Это нужно для того, чтобы примеры использовались модифицированные и переведённые. Так как файлы справки CHM используют их при нажатии кнопки "Открыть".

2. Содержимое Include скопируйте в папку "AutoIt3\Include", чтобы примеры из CustomUDFs.chm были работоспособными.

3. Файлы справки *.chm скопировать в каталог "C:\Program Files\AutoIt3", заменив оригинальные файлы справки. Для любителей чёрного стиля использовать *.chm из каталога "- Black style help file -"

Структура комплекта сделана в соответствии с оригиналом, что позволяет открывать/запускать примеры (Examples) даже не заменяя оригинальную справку.
Нужно ли заменять справочные файлы версии 3.3.8.1? Да рекомендуется, но сначала сделайте копии англоязычных файлов справки, чтобы заглядывать в них в случае сомнений.
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
Dessan
не могу теперь ничего найти
Ответ #19 (под спойлером)

В той теме в Ответе #1 находится модификация этой же функции с возможностью искать оттенки цвета. Там добавлен параметр $i_Shade, отвечающий за оттенок (от 0 до 255).
 
Автор
D
Сообщения
137
Репутация
-2
Alofa сказал(а):
OffTopic:
Dessan сказал(а):
... Скаченная справка на русском так и не запустилась...
Это нонсенс. :Virus:
Скачиваете Полный комплект справки, внутри архива находите файл "Описание.txt" и читаете его. :Rulz:
------------------------ Установка справки ------------------------

1. Файлы из каталога "Examples\Helpfile" скопировать в "C:\Program Files\AutoIt3\Examples\Helpfile" с заменой оригинальных. Это нужно для того, чтобы примеры использовались модифицированные и переведённые. Так как файлы справки CHM используют их при нажатии кнопки "Открыть".

2. Содержимое Include скопируйте в папку "AutoIt3\Include", чтобы примеры из CustomUDFs.chm были работоспособными.

3. Файлы справки *.chm скопировать в каталог "C:\Program Files\AutoIt3", заменив оригинальные файлы справки. Для любителей чёрного стиля использовать *.chm из каталога "- Black style help file -"

Структура комплекта сделана в соответствии с оригиналом, что позволяет открывать/запускать примеры (Examples) даже не заменяя оригинальную справку.
Нужно ли заменять справочные файлы версии 3.3.8.1? Да рекомендуется, но сначала сделайте копии англоязычных файлов справки, чтобы заглядывать в них в случае сомнений.

Скачал по ссылке, зашёл, нажал - слева список вижу, справа - Переход на веб-страницу отменен.
Должно всё показывать даже без перемещения файлов, потому что файлы это только примеры.


Добавлено:
Сообщение автоматически объединено:

InnI сказал(а):
Dessan
не могу теперь ничего найти
Ответ #19 (под спойлером)

В той теме в Ответе #1 находится модификация этой же функции с возможностью искать оттенки цвета. Там добавлен параметр $i_Shade, отвечающий за оттенок (от 0 до 255).

Благодарю в очередной раз
 
Автор
D
Сообщения
137
Репутация
-2
Alofa сказал(а):
OffTopic:
Dessan сказал(а):
... Скаченная справка на русском так и не запустилась...
Это нонсенс. :Virus:
Скачиваете Полный комплект справки, внутри архива находите файл "Описание.txt" и читаете его. :Rulz:
------------------------ Установка справки ------------------------

1. Файлы из каталога "Examples\Helpfile" скопировать в "C:\Program Files\AutoIt3\Examples\Helpfile" с заменой оригинальных. Это нужно для того, чтобы примеры использовались модифицированные и переведённые. Так как файлы справки CHM используют их при нажатии кнопки "Открыть".

2. Содержимое Include скопируйте в папку "AutoIt3\Include", чтобы примеры из CustomUDFs.chm были работоспособными.

3. Файлы справки *.chm скопировать в каталог "C:\Program Files\AutoIt3", заменив оригинальные файлы справки. Для любителей чёрного стиля использовать *.chm из каталога "- Black style help file -"

Структура комплекта сделана в соответствии с оригиналом, что позволяет открывать/запускать примеры (Examples) даже не заменяя оригинальную справку.
Нужно ли заменять справочные файлы версии 3.3.8.1? Да рекомендуется, но сначала сделайте копии англоязычных файлов справки, чтобы заглядывать в них в случае сомнений.

Нужно дважды было зайти в свойства и нажать "Разблокировать". Почему именно дважды - не знаю, но теперь заработало всё
 
Верх