baracuda |
Отправлено: 12 Июля, 2013 - 22:37:33
|
Прохожий
Покинул форум
Сообщений всего: 23
Дата рег-ции: Июль 2013
Репутация: 1
|
Не работает, возможно из за нескольких одинаковых изображений.. не может решить какое нажать
(Добавление)
Спасибо за подсказки решил вопрос вот так:
int Image_1[55][16];
loadimage (#Image_1[0][0], "C:\tupit.bmp"
int PosX_1[512];int PosY_1[512];
findimage(-1, #Image_1[0][0], 0, #PosX_1[0], #PosY_1[0], 0, 0, 1280, 770, -1);
//mouse(LEFT, x[0]+imagewidth(#Image[0][0])/2, y[0]+imageheight(#Image[0][0])/2+3, 1, wind);
mouse (LEFT, PosX_1[0]+1, PosY_1[0]+1, 1, wind);
sleep(3000);
Хотя универсальности это не даёт |
|
|
Kibor |
Отправлено: 12 Июля, 2013 - 23:10:37
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
baracuda пишет: Не работает, возможно из за нескольких одинаковых изображений.. не может решить какое нажать
(Добавление)
Спасибо за подсказки решил вопрос вот так:
int Image_1[55][16];
loadimage (#Image_1[0][0], "C:\tupit.bmp");
int PosX_1[512];int PosY_1[512];
findimage(-1, #Image_1[0][0], 0, #PosX_1[0], #PosY_1[0], 0, 0, 1280, 770, -1);
//mouse(LEFT, x[0]+imagewidth(#Image[0][0])/2, y[0]+imageheight(#Image[0][0])/2+3, 1, wind);
mouse (LEFT, PosX_1[0]+1, PosY_1[0]+1, 1, wind);
sleep(3000);
Хотя универсальности это не даёт
Если на экране несколько таких изображений то в первом скрипте неправильно выделена память под координаты:
baracuda пишет: int x[1], y[1];
Первый параметр функции поиска указал что ищутся все найденые изображения:
baracuda пишет: st: if (findimage(-1, #Image[0][0], 16777215, #x[0], #y[0], 0, 2, wind.widthclient, wind.heightclient, wind)<1)goto st;
Так как первый параметр -1 ищутся все изображения, но память выделена на одно. Функция возвращает тогда не количество изображений а код ошибки переполнения памяти. Проверьте messagebox(findimage(-1, #Image[0][0], 16777215, #x[0], #y[0], 0, 2, wind.widthclient, wind.heightclient, wind));
Коды ошибок findimage
-1 размер масива в который записываются X координаты меньше найденых изабражений
-2 размер масива в который записываются Y координаты меньше найденых изабражений
-3 Область поиска меньше искомого рисунка по X
-4 Область поиска меньше искомого рисунка по Y
Возвращается отрицательное число и программа зависает в цикл.
Во втором цикле вы просто увеличили размер масивов. Поэтому работает.
Если надо найти только одно изображение надо указывать первым параметром 1, если 2 - 2... Если все указывать -1. |
|
|
baracuda |
Отправлено: 12 Июля, 2013 - 23:29:31
|
Прохожий
Покинул форум
Сообщений всего: 23
Дата рег-ции: Июль 2013
Репутация: 1
|
спасибо за подробные ответы.. единственное не совсем понял как реализовать
int Image_1[55][16];
loadimage (#Image_1[0][0], "C:\Image_2.bmp"
int PosX_1[512];int PosY_1[512];
findimage(1, #Image_1[0][0], 0, #PosX_1[0], #PosY_1[0], 0, 0, 1280, 770, -1);
mouse (LEFT, PosX_1[0]+1, PosY_1[0]+1, 1, wind);
sleep(10000);
//Вот тут открылось новое окно при клике, а точнее скорее всего попап на котором надо найти картинку(но можно и усложнить одну из 3 картинок)
int Image_0[180][26];
loadimage (#Image_0[0][0], "C:\Image_3.bmp"
int PosX_0[512];int PosY_0[512];
findimage(1, #Image_0[0][0], 0, #PosX_0[0], #PosY_0[0], 0, 0, 1280, 770, -1);
mouse (LEFT, PosX_0[0]+1, PosY_0[0]+1, 1, wind);
sleep(10000);
ну а дальше после найденной картинки и клика нужно закрыть попап.. но главное окно браузера должно оставаться, там будет опять искать картинку и так по кругу пока есть картинки на главной странице |
|
|
Kibor |
Отправлено: 13 Июля, 2013 - 07:45:58
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
win wind это указатель (хэндл) на окно. Это простая переменная и узнавать его можно сколько угодно раз с помощью функции
window. В виде параметров этой функции указываем уникальные данные окна указатель на которое мы хотим получить. К примеру если всплывающее окно имеет постоянный уникальный размер или позицию можно искать указатель на него по этим данным.
В данном случае я вообще не вижу смысла искать win каждого всплывающего окна. Зачем?
Если надо только найти изображение в всплывающем окне, нажать на него и закрыть всплывающее окно достаточно найти изображение в пределах окна браузера или экрана если браузер во весь экран, щелкнуть по нему мышкой и отправить браузеру сочетание клавиш alt+f4 для того чтобы закрыть всплывающее окно:
keydown(MENU);
key(F4);
keyup(MENU);
Данный код отправит alt+f4 активному окну, а активным будет всплывающее.
Один момент по использованию четвертого параметра в функции mouse. При установке его в 1 узазывается что перед кликом надо передать фокус окну на который указывает пятый параметр. Если пятый параметр указывает на главное окно браузера а нажать надо во всплывающем четверный параметр должен быть 0.
В последнем приведенном вами коде вообще неправильно применен указатель:
baracuda пишет: findimage(1, #Image_1[0][0], 0, #PosX_1[0], #PosY_1[0], 0, 0, 1280, 770, -1);
mouse (LEFT, PosX_1[0]+1, PosY_1[0]+1, 1, wind);
В findimage ищется изображение по всему экрану и в PosX_1[0], PosY_1[0] записываются координаты изображения на экране относительно левого верхнего угла экрана, а в mouse щелчек происходит по таким же координатам только относительно окна на которое указывает wind.
Примерно может быть так:
win wind=window ("Новая вкладка - Google Chrome", "Chrome_WidgetWin_1", -1);
activate(wind);
int Image_1[55][16];
loadimage (#Image_1[0][0], "C:\Image_2.bmp");
int PosX_1[1], PosY_1[1]; //Ищем только одно изображение
int Image_0[180][26];
loadimage (#Image_0[0][0], "C:\Image_3.bmp");
int PosX_0[1], PosY_0[1];//Ищем только одно изображение
n:;
findimage(1, #Image_1[0][0], 0, #PosX_1[0], #PosY_1[0], 0, 0, 1280, 770, wind);
mouse (LEFT, PosX_1[0]+1, PosY_1[0]+1, 1, wind);
sleep(10000);
//Вот тут открылось новое окно при клике, а точнее скорее всего попап на котором надо найти картинку(но можно и усложнить одну из 3 картинок)
findimage(1, #Image_0[0][0], 0, #PosX_0[0], #PosY_0[0], 0, 0, 1280, 770, wind);
mouse (LEFT, PosX_0[0]+1, PosY_0[0]+1, 0, wind);
sleep(10000);
//Закрываем окошко
keydown(MENU);
key(F4);
keyup(MENU);
goto n; |
|
|
|