Автоматизация и боты

 Помощь      Поиск      Пользователи
Сайт Кибор     Программируемый кликер Кибор     Видео обучение     Заказать бот

 Страниц (5): [1] 2 3 4 5 »   

> Без описания
zaxlex
Отправлено: 18 Января, 2014 - 12:31:31
Post Id



Пользователь
Участник


Покинул форум
Сообщений всего: 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 - значит идет зависание в цикле) Все превыдущие действия производят моментальные изменения на экране, а после нажатия кнопки установить требуется какое-то время для установки, только после этого появляется кнопка ОК. Если вручную установить( чтобы на экране была кнопка ок) и запустить только этот участок кода, то кнопка ок успешно нажимается. В чем может быть проблема?
 
 Top
Kibor
Отправлено: 18 Января, 2014 - 12:57:33
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 8095
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 355




 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);
 
 Top
zaxlex
Отправлено: 18 Января, 2014 - 14:51:14
Post Id



Пользователь
Участник


Покинул форум
Сообщений всего: 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)

 
 Top
Kibor
Отправлено: 18 Января, 2014 - 15:01:02
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 8095
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 355




Все нормально. Только вынесите свою функцию в низ скрипта:

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);
}


А зависание может быть из за того что не найден рисунок
 
 Top
zaxlex
Отправлено: 18 Января, 2014 - 15:27:02
Post Id



Пользователь
Участник


Покинул форум
Сообщений всего: 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)

 
 Top
Kibor
Отправлено: 18 Января, 2014 - 15:38:48
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 8095
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 355




Какой размер имеет рисунок?

 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 с заменой.Заработало

Не может такого быть что иконка в трее изменилась? Проверьте код на заранее статичной части на экране.
 
 Top
zaxlex
Отправлено: 18 Января, 2014 - 15:48:32
Post Id



Пользователь
Участник


Покинул форум
Сообщений всего: 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)

 
 Top
Kibor
Отправлено: 18 Января, 2014 - 15:56:57
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 8095
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 355




 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"

Ошибка с скрипте. Нет конца инструкции. - ( ; )
 
 Top
zaxlex
Отправлено: 18 Января, 2014 - 16:10:23
Post Id



Пользователь
Участник


Покинул форум
Сообщений всего: 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);
}

При таком запуске также виснет цикл.
 
 Top
Kibor
Отправлено: 18 Января, 2014 - 16:15:48
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 8095
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 355




 zaxlex пишет:
string k1="C:\Images\sand.bmp",k2="C:\Images\1.bmp"

Ошибка. Нет конца инструкции. Я дополнил ответ свой выше.

Код в теги берите с помощью кнопки в редакторе на форуме.
 
 Top
Страниц (5): [1] 2 3 4 5 »
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« Вопросы и решение проблем »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 




Powered by