zaxlex |
Отправлено: 18 Января, 2014 - 12:31:31
|
Участник
Покинул форум
Сообщений всего: 54
Дата рег-ции: Янв. 2014
Репутация: 0
|
Во-первых - большое спасибо автору за программу.
Во-вторых - прошу помощь с проблемой. - Есть такой код поиска изображения на экране и клика по нему:
CODE:win w=window ("Program Manager", "Progman", -1);
int king6[300][300];
loadimage(#king6[0][0],"C:\Images\ok.bmp");
int x6[1],y6[1];
n: if (findimage(1, #king6[0][0], 255, #x6[1], #y6[1], 0, 0, 1920, 1080, w)==0)
{
sleep(50);
goto n;
}
mouse(LEFT,x6[1]+50,y6[1]+10);
sleep(1000);
До этого в скрипте идет точной такой же код,который успешно выполняется.Код выполняет установку одной игры.Нужно конечно сделать функцию под это дело, но пока делаю все в лоб.Скрипт успешно выполняется до момента установки, после установки нужно нажать кнопку ОК,но кибор ее не видит.( такой вывод я сделал потому что из скрипта мне надо выходить с помощью CTRL+SHIFT+Z - значит идет зависание в цикле) Все превыдущие действия производят моментальные изменения на экране, а после нажатия кнопки установить требуется какое-то время для установки, только после этого появляется кнопка ОК. Если вручную установить( чтобы на экране была кнопка ок) и запустить только этот участок кода, то кнопка ок успешно нажимается. В чем может быть проблема? |
|
|
Kibor |
Отправлено: 18 Января, 2014 - 12:57:33
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
zaxlex пишет: win w=window ("Program Manager", "Progman", -1);
int king6[300][300];
loadimage(#king6[0][0],"C:\Images\ok.bmp");
int x6[1],y6[1];
n: if (findimage(1, #king6[0][0], 255, #x6[1], #y6[1], 0, 0, 1920, 1080, w)==0)
{
sleep(50);
goto n;
}
mouse(LEFT,x6[1]+50,y6[1]+10);
sleep(1000);
Вообще странно что этот код не приводит к краху Кибор, так как идет обращение к не выделенной памяти. Быстрее всего после int x6[1],y6[1]; еще есть объявление int...
Ошибка в передаче указателей в findimage.
n: if (findimage(1, #king6[0][0], 255, #x6[1], #y6[1], 0, 0, 1920, 1080, w)==0)
Указатель указывает на второй элемент массива. Первый это 0.
А сам массив имеет размер в 1 элемент int x6[1],y6[1];
Еще ошибка в указание системы координат в функции mouse. Она указана в экранных координатах, а координаты в x6[1]+50,y6[1]+10 записаны в оконных относительно win w=window ("Program Manager", "Progman", -1);
В данном случае будет кликать правильно только из за того, что указатель указывает на рабочий стол и координаты совпадают с экранными.
Правильно так кликать если в findimage указатель на окно:
Цитата: win w=window ("Program Manager", "Progman", -1);
int king6[300][300];
loadimage(#king6[0][0],"C:\Images\ok.bmp");
int x6[1],y6[1];
n: if (findimage(1, #king6[0][0], 255, #x6[0], #y6[0], 0, 0, 1920, 1080, w)==0)
{
sleep(50);
goto n;
}
mouse(LEFT,x6[0]+50,y6[0]+10, 0, w);
sleep(1000);
Можно вообще так, так как тут массив не нужен так как поиск одного изображения
Цитата: win w=window ("Program Manager", "Progman", -1);
int king6[300][300];
loadimage(#king6[0][0],"C:\Images\ok.bmp");
int x6,y6;
n: if (findimage(1, #king6[0][0], 255, #x6, #y6, 0, 0, 1920, 1080, w)==0)
{
sleep(50);
goto n;
}
mouse(LEFT,x6+50,y6+10, 0, w);
sleep(1000);
Ну а если очень хочется в экранных, то не надо указывать указатель на рабочий стол ("Program Manager", "Progman")
Можно просто в функции вместо указателя поставить -1
Цитата: int king6[300][300];
loadimage(#king6[0][0],"C:\Images\ok.bmp");
int x6,y6;
n: if (findimage(1, #king6[0][0], 255, #x6, #y6, 0, 0, 1920, 1080, -1)==0)
{
sleep(50);
goto n;
}
mouse(LEFT,x6+50,y6+10);
sleep(1000);
Ну а вообще то, для нажатия на кнопки можно использовать другой подход :
Навести мышь на нужную кнопку
Нажать контр шифт s
В графе контролов получить указатель на кнопку http://filesd.net/kibor/spy.php (поле 17).
И напрямую послать по этому указателю нажатие на кнопку:
Пример нажатия кнопки Обзор в диалоге Выполнить в win 7 (Запускаем диалог (Выполнить) в вин 7 - Пуск>выполнить.)
CODE:button(1 , window ("Об&зор...", -1, window ("Выполнить")));
Работает даже с не активным окном программы.
При необходимости следить за появлением кнопки можно так
CODE:
win w;
a: w=window ("Об&зор...", -1, window ("Выполнить"));
if (w==0){sleep(50); goto a;}
sleep(200);
button(1 , w);
|
|
|
zaxlex |
Отправлено: 18 Января, 2014 - 14:51:14
|
Участник
Покинул форум
Сообщений всего: 54
Дата рег-ции: Янв. 2014
Репутация: 0
|
благодарю за помощь, теперь хочу реализовать функцию, чтобы упростить код.
CODE:int king[400][400];
int x,y;
string k1="C:\Images\sand.bmp";
function klik (string q)
{
loadimage(#king[0][0],q);
n: if (findimage(1, #king[0][0], 255, #x, #y, 0, 0, 1920, 1080, -1)==0)
{
sleep(50);
goto n;
}
mouseup(RIGHT,x+10,y+10);
sleep(1000);
}
klik(k1);
Идет зависание цикла. Где я тут не прав?Без функции все работает.(Отредактировано автором: 18 Января, 2014 - 14:52:19) |
|
|
Kibor |
Отправлено: 18 Января, 2014 - 15:01:02
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Все нормально. Только вынесите свою функцию в низ скрипта:
CODE:int king[400][400];
int x,y;
string k1="C:\Images\sand.bmp";
klik(k1);
///////////////////////////////////////////////
function klik (string q)
{
loadimage(#king[0][0],q);
n: if (findimage(1, #king[0][0], 255, #x, #y, 0, 0, 1920, 1080, -1)==0)
{
sleep(50);
goto n;
}
mouseup(RIGHT,x+10,y+10);
sleep(1000);
}
А зависание может быть из за того что не найден рисунок |
|
|
zaxlex |
Отправлено: 18 Января, 2014 - 15:27:02
|
Участник
Покинул форум
Сообщений всего: 54
Дата рег-ции: Янв. 2014
Репутация: 0
|
это какой-то ужас.Вот просто скопировал изменив название функции-
CODE:int king[400][400];
int x,y;
string k1="C:\Images\sand.bmp";
klikright(k1);
///////////////////////////////////////////////
function klikright (string q)
{
loadimage(#king[0][0],q);
n: if (findimage(1, #king[0][0], 255, #x, #y, 0, 0, 1920, 1080, -1)==0)
{
sleep(50);
goto n;
}
mouseup(RIGHT,x+10,y+10);
sleep(1000);
}
Не работает - виснет цикл, потом делаю новый снимок экрана с помощью графики Кибора. Называю файл sand.bmp и кидаю в папку images с заменой.Заработало. Теперь пишу следующую функцию для клика левой кнопкой по другому изображению - не работает, удаляю все что я написал - не работает.Функция klikright - функция клика правой кнопкой по изображению иконки в трее, в чем может быть проблема?Только что сделал этот же процесс(новый снимок искомого изображения) и опять заработало.(Отредактировано автором: 18 Января, 2014 - 15:31:14) |
|
|
Kibor |
Отправлено: 18 Января, 2014 - 15:38:48
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Какой размер имеет рисунок?
zaxlex пишет: Теперь пишу следующую функцию для клика левой кнопкой по другому изображению - не работает
Весь код в студию. с новой функцией.
Проверяйте ошибки так:
CODE:int king[400][400];
int x,y;
string k1="C:\Images\sand.bmp";
klikright(k1);
///////////////////////////////////////////////
function klikright (string q)
{
if (loadimage(#king[0][0],q)<1)messagebox ("ошибка");
n: if (findimage(1, #king[0][0], 255, #x, #y, 0, 0, 1920, 1080, -1)==0)
{
sleep(50);
goto n;
}
mouseup(RIGHT,x+10,y+10);
sleep(1000);
}
Берите код в теги код.
zaxlex пишет: потом делаю новый снимок экрана с помощью графики Кибора. Называю файл sand.bmp и кидаю в папку images с заменой.Заработало
Не может такого быть что иконка в трее изменилась? Проверьте код на заранее статичной части на экране. |
|
|
zaxlex |
Отправлено: 18 Января, 2014 - 15:48:32
|
Участник
Покинул форум
Сообщений всего: 54
Дата рег-ции: Янв. 2014
Репутация: 0
|
теперь эта проблема прошла - мне кажется просто глюк, теперь первую функцию выполняет , а 2-ую - выдает ошибку - failed to open DIB file. Перезалил новый bmp файл - не помогло, возможно это из-за того, что я записываю изображение в один и тот же массив?
CODE:int king[400][400];
int x,y;
string k1="C:\Images\sand.bmp",k2="C:\Images\1.bmp"
klikright(k1);
klikleft(k2);
///////////////////////////////////////////////
function klikright (string q)
{
loadimage(#king[0][0],q);
n: if (findimage(1, #king[0][0], 255, #x, #y, 0, 0, 1920, 1080, -1)==0)
{
sleep(50);
goto n;
}
mouseup(RIGHT,x+10,y+10);
sleep(1000);
}
function klikleft (string f)
{
loadimage(#king[0][0],f);
n: if (findimage(1, #king[0][0], 255, #x, #y, 0, 0, 1920, 1080, -1)==0)
{
sleep(50);
goto n;
}
mouse(LEFT,x+10,y+10);
sleep(1000);
} (Отредактировано автором: 18 Января, 2014 - 15:49:19) |
|
|
Kibor |
Отправлено: 18 Января, 2014 - 15:56:57
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
zaxlex пишет: теперь эта проблема прошла - мне кажется просто глюк
Нет. Не глюк это.
Kibor пишет: Проверяйте ошибки так:
CODE:
int king[400][400];
int x,y;
string k1="C:\Images\sand.bmp";
klikright(k1);
///////////////////////////////////////////////
function klikright (string q)
{
if (loadimage(#king[0][0],q)<1)messagebox ("ошибка");
n: if (findimage(1, #king[0][0], 255, #x, #y, 0, 0, 1920, 1080, -1)==0)
{
sleep(50);
goto n;
}
mouseup(RIGHT,x+10,y+10);
sleep(1000);
}
Почитать список ошибок loadimage http://filesd.net/kibor/loadimage.php
Цитата: Функция loadimage возвращает:
-1 отсутствует файл
-2 Размер масива по x меньше размера картинки по x
-3 Размер масива по y меньше размера картинки по y
В случае успешной загрузки возвращается количество загруженых пикселей.
failed to open DIB file - не найден файл по этому пути. Проверяйте правильность пути и имени.
(Добавление)
zaxlex пишет: string k1="C:\Images\sand.bmp",k2="C:\Images\1.bmp"
Ошибка с скрипте. Нет конца инструкции. - ( ; ) |
|
|
zaxlex |
Отправлено: 18 Января, 2014 - 16:10:23
|
Участник
Покинул форум
Сообщений всего: 54
Дата рег-ции: Янв. 2014
Репутация: 0
|
CODE:int king[400][400];
int x,y;
string k1="C:\Images\sand.bmp",k2="C:\Images\1.bmp"
klikright(k1);
klikleft(k2);
///////////////////////////////////////////////
function klikright (string q)
{
if (loadimage(#king[0][0],q)<1)messagebox ("ошибка");
n: if (findimage(1, #king[0][0], 255, #x, #y, 0, 0, 1920, 1080, -1)==0)
{
sleep(50);
goto n;
}
mouseup(RIGHT,x+10,y+10);
sleep(1000);
}
function klikleft (string f)
{
loadimage(#king[0][0],f);
n1: if (findimage(1, #king[0][0], 255, #x, #y, 0, 0, 1920, 1080, -1)==0)
{
sleep(50);
goto n1;
}
mouse(LEFT,x+10,y+10);
sleep(1000);
Поменял название перехода goto во 2-ой функции, изображения загружаются - все проходят в формат 400 на 400, ошибку не выдает, цикл виснет.Я так понял на первой функции, вы правы это не глюк.
[i](Добавление)[/i]
int king[400][400];
int x,y;
string k1="C:\Images\sand.bmp",k2="C:\Images\1.bmp"
klikright(k1);
//klikleft(k2);
///////////////////////////////////////////////
function klikright (string q)
{
if (loadimage(#king[0][0],q)<1)messagebox ("îøèáêà");
n: if (findimage(1, #king[0][0], 255, #x, #y, 0, 0, 1920, 1080, -1)==0)
{
sleep(50);
goto n;
}
mouseup(RIGHT,x+10,y+10);
sleep(1000);
}
/*function klikleft (string f)
{
loadimage(#king[0][0],f);
n1: if (findimage(1, #king[0][0], 255, #x, #y, 0, 0, 1920, 1080, -1)==0)
{
sleep(50);
goto n1;
}
mouse(LEFT,x+10,y+10);
sleep(1000);
}
При таком запуске также виснет цикл. |
|
|
|