Что нового

[Окна, Диалоги] Поиск цвета

benxomi

Новичок
Сообщения
37
Репутация
0
Всем привет, как можно сделать поиск цвет в независимости от положения окна.
Раньше использовал
Код:
$left='';Левая
$top='';Верхняя
$right='';Правая
$bottom='';нижняя
$color='';Цвет 
$pos = PixelSearch ( $left, $top, $right, $bottom, $color)
;координаты писал где расположено окно

Но как сдвинешь окно, поиск идёт уже не точный, хотелось бы что бы поиск был только в этом окне, в независимости куда я подвину окно
 

Olim98

Новичок
Сообщения
48
Репутация
2
benxomi
Код:
$left='';Левая
$top='';Верхняя
$right='';Правая
$bottom='';нижняя
$color='';Цвет
$hWnd='';хэндл окна в котором нужно искать
Opt("PixelCoordMode", 2) ; Работа с координатами относительно окна
PixelSearch($left, $top, $right, $bottom, $color, Default, Default, $hWnd)
 
Автор
B

benxomi

Новичок
Сообщения
37
Репутация
0
Olim98 сказал(а):
benxomi
Код:
$left='';Левая
$top='';Верхняя
$right='';Правая
$bottom='';нижняя
$color='';Цвет
$hWnd='';хэндл окна в котором нужно искать
Opt("PixelCoordMode", 2) ; Работа с координатами относительно окна
PixelSearch($left, $top, $right, $bottom, $color, Default, Default, $hWnd)
Спасибо это помогло, но только работает нормально он в полно-экранном режиме, а надо что бы в любом размере экрана
 

oesoes

xor eax,eax
Сообщения
171
Репутация
9
Нужно окно одного разрешения держать. А ты его наверное как хотишь, так и воротишь... Даже если ты его сузил на пиксел, то уже результат не тот получишь, т.к. разрешение считай поменял.
 
Автор
B

benxomi

Новичок
Сообщения
37
Репутация
0
oesoes сказал(а):
Нужно окно одного разрешения держать. А ты его наверное как хотишь, так и воротишь... Даже если ты его сузил на пиксел, то уже результат не тот получишь, т.к. разрешение считай поменял.
Я и говорю, можно ли сделать так что бы не зависло от разрешения и местоположения окна
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Можно, только твои 5 строчек кода могут превратиться в несколько сотен\тысяч строк. Самый простой способ - опиши все варианты размеров\положений твоего окна и будет тебе счастье.
 
Автор
B

benxomi

Новичок
Сообщения
37
Репутация
0
Belfigor сказал(а):
Можно, только твои 5 строчек кода могут превратиться в несколько сотен\тысяч строк. Самый простой способ - опиши все варианты размеров\положений твоего окна и будет тебе счастье.
Точно так же много строк, потому что окно - браузерное, размер можно поставить абсолютно разный


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

Может можно тогда этот объект как-то по-другому найти, раз путей нету
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
А не проще ли всегда приводить окно к одному состоянию? Положению и размеру. Или требовать этого от пользователя.
 
Автор
B

benxomi

Новичок
Сообщения
37
Репутация
0
Belfigor сказал(а):
А не проще ли всегда приводить окно к одному состоянию? Положению и размеру. Или требовать этого от пользователя.
Это будет тяжело, тем более если потом это программу скинуть другому, как он сможет поставить браузер туда куда надо и с таким размером как у меня


Может можно тогда, что бы при включение программы он задавал размер окна и куда ставить сам?(без моего участия поставил бы окно в нужное место, с нужным размером)
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
можно ли сделать так что бы не зависло от разрешения и местоположения окна

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

benxomi

Новичок
Сообщения
37
Репутация
0
C2H5OH сказал(а):
можно ли сделать так что бы не зависло от разрешения и местоположения окна

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

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Только не совсем понял что мне это даст, это ведь не решит эту проблему

А что, картинка масштабируется при изменении размера окна??
 
Автор
B

benxomi

Новичок
Сообщения
37
Репутация
0
Это должно так выглядеть?
Код:
While 1
ControlFocus($WindowTitle,'', $ControlID)
$left='3';Левая координата области для поиска
$top='51';Верхняя
$right='1116';Праввая
$bottom='758';нижняя
$color='0xF3970C';Цвет пиксела
$hwnd=''
Opt("PixelCoordMode", 2)
$pos = PixelSearch ( $left, $top, $right, $bottom, $color, $hwnd)
$pos = ControlGetPos($WindowTitle,"",$ControlID)
   if @error ==0 then
;не знаю как смещения окна написать, то-бишь коррдинаты
    ControlClick("","","[CLASS:; INSTANCE:1]","left",1,$pos[0],$pos[1])
EndIf
Sleep(3000)
WEnd

Вот это по ближе к истине))
Код:
$wgp=WinGetPos('[CLASS:]') 
$wgcs=WinGetClientSize('[CLASS:]') 
$d1=($wgp[2]-$wgcs[0])/2; не могли бы подсказать почему ошибка в этой строке
$d2=$wgp[3]-$wgcs[1]-$d1 
$cgp=ControlGetPos('[CLASS:]', '', '[CLASS:; INSTANCE:]') 
$X=$wgp[0]+$d1+$cgp[0] 
$Y=$wgp[1]+$d2+$cgp[1]

И что-то не выходит соединить поиск цвета и ControlClick, с этим
 
Автор
B

benxomi

Новичок
Сообщения
37
Репутация
0
Вообщем вот что вышло
Код:
While 1
$aPos = WinGetPos("[TITLE:]")
$wgcs=WinGetClientSize("[TITLE:]")
Sleep(1000)
$left=$aPos[0]
$top=$aPos[1]
$right=$aPos[2]
$bottom=$aPos[3]
$color='0xF3970C'
$pos=PixelSearch( $left, $top, $right, $bottom, $color)
ControlClick("","","[CLASS:; INSTANCE:1]","left",1,$pos[0],$pos[1])
Sleep(3000)
WEnd

Если использовать ControlClick как в моём примере, то он тыкает на порядок ниже чем надо.
Если использовать за место ControlClick(MouseMove) мышь двигается туда, куда надо.
Не могли бы помочь, как сделать что бы с ControlClick клик был куда надо(как я понял используя ControlClick он отсчитывает от левого верхнего угла рабочего стола и если окно открыть на весь экран, работает хорошо, но задача стоит в том что бы в любом размере)
 

bugaj

Знающий
Сообщения
140
Репутация
11
$wgcs=WinGetClientSize("[TITLE:]")

размер окна можно не только получать, но и менять програмно, приводя его к единому размеру


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

как я понял используя ControlClick он отсчитывает от левого верхнего угла рабочего стола

а в описании написано
Координата X для клика внутри элемента, относительно левого верхнего угла элемента. По умолчанию в центре.

Код:
ControlClick("","","[CLASS:; INSTANCE:1]","left",1,$pos[0],$pos[1])


может нужно все параметры заполнять просто и имя окна тоже? может он и кликает относительно рабочего стола потому что окна не находит
 
Автор
B

benxomi

Новичок
Сообщения
37
Репутация
0
может нужно все параметры заполнять просто и имя окна тоже? может он и кликает относительно рабочего стола потому что окна не находит
Я все заполняю, просто сюда не написал.
Много уже способов пробовал, но через контролклик он по цели не попадает(только в полноэкранном работает нормально)
 

bugaj

Знающий
Сообщения
140
Репутация
11
Я все заполняю, просто сюда не написал.
Много уже способов пробовал, но через контролклик он по цели не попадает(только в полноэкранном работает нормально)

ну тада не знаю, можно на WinApi свою такую функцию сделать ) а что происходит внутри этой мне не ведомо. кстати а что она возвращает? 0 или 1?
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
bugaj [?]
размер окна можно не только получать, но и менять програмно, приводя его к единому размеру
Надо всегда держать в уме, что окно с измененным размером, иногда (зависит от рукожопости разработчиков окна), даже визуально изменив размер, координаты контролов оставляет как у оригинального 100% размера. Попытаюсь привести пример:
У нас было окно с размером 100%, у него справа внизу на координате 98%\80% была кнопка "Пуск". Мы изменили размер до 50%, теперь мы видим маленькую кнопку пуск, по координатам 54%\40%, а на прошлых координатах 98%\80% у нас рабочий стол. Но если мы тыкаем на текущее место положение кнопки, мы не видим результата. Ибо реакция произойдет только если мы ткнем на 98/80 координаты.
 
Верх