Kibor |
Отправлено: 18 Августа, 2013 - 00:27:46
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Добавлена возможность программировать клики и перетаскивания мыши в свернутом и неактивном окне.
sendmouse - Делает клик в клиентских координатах окна КОНТРОЛА на который указывает указатель.
Синтаксиc:
CODE:sendmouse (LEFT, 200, 250, wind);
Третий и четвертый параметры указывают на клиентские координаты КОНТРОЛА на который указывает указатель wind.
Как получить указатель на контрол:
Пример получения указателя на клиентскую часть окна ПАИНТ.
Наводим мышь на поле для рисования, жмем CTRL+SHIFT+S. В верхней части шпиона находится указатель на окно программы ПАИНТ. Необходимый нам указатель на контрол в котором непосредственно происходит рисование находится в нижней части.
Для всех функций начинающихся на send надо получать указатели не на главное окно, а на контрол (если он есть появляется при нажатие CTRL+SHIFT+S). То же самое касается sendkey, sendkeydown и sendkeyup.
=================================================
sendmousedown (LEFT, 200, 250, wind) - нажимает левую кнопку мыши. RIGHT правую, MIDDLE среднюю.
sendmouseup (LEFT, 200, 250, wind) - отпускает левую кнопку мыши. RIGHT правую, MIDDLE среднюю.
sendmousedbl (LEFT, 200, 250, wind) - двойной клик левой кнопкой мыши. RIGHT правой, MIDDLE средней.
sendmousemove (200, 250, wind) - перемещение мыши в указанные клиентские координаты окна.
sendmousetransfer(LEFT, 200, 250, 300, 350, 0.02, wind) - перетаскивание с зажатой левой кнопкой, RIGHT правой, MIDDLE средней, -1 не нажатые.
=================================================
Пример рисования в свернутом окне паита:
CODE:win w=window (-1, "Afx:00000000FFB90000:8", window ("Безымянный - Paint", "MSPaintApp", -1));//Получить указатель на поле для рисования в Паинт
sendmousetransfer(LEFT, 200, 200, 250, 250, 0.02, w);//Провести линию с зажатой левой кнопкой мыши с клиентских координат 200, 200 в 250, 250.
=================================================
А вот к примеру в браузере Мозила один указатель на главное окно и достаточно получить указатель на главное окно в верхней части шпиона. Координаты по которым будут идти клики можно узнать наведя мышь на нужную ссылку и нажав CTRL+SHIFT+S. Координаты для клика берем в поле Мышь в клиентской части окна. |
|
|
ArtChemist |
Отправлено: 18 Августа, 2013 - 06:49:03
|
Участник
Покинул форум
Сообщений всего: 54
Дата рег-ции: Июль 2013
Репутация: 1
|
Боюсь у меня ваш скрипт для паинта не сработал и в игру тоже не получается посылать клики, а вот в браузере все работает замечательно.
P. S.
В игре при нажатии CTR+SHIFT+S ни каких контролов не появляется только окно( хотя в браузере было так же, но работает).
(Добавление)
Так, с паинтом разобрался все работает, а вот игру оживить ни как не получается(
вот например кусочек кода, должен кликать по иконке персонажа:
CODE:win w=window (-1, -1, window ("Illodemiur", "SunAwtFrame", -1));
sendmouse(LEFT, 27, 118, w);
координаты клика клиентские. Проверял в других окнах и играх все работает, именно в это окно отказывается посылать нажатия мыши и клавиш. |
|
|
Kibor |
Отправлено: 18 Августа, 2013 - 09:04:51
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
ArtChemist пишет: Боюсь у меня ваш скрипт для паинта не сработал
Конечно не сработал для вашего паинта...
Исходя из куска вашего кода для кикермана Kibor пишет: WNDPOS(WNDFIND (" Paint" ,10,10) и моего Kibor пишет: window ("Безымянный - Paint", "MSPaintApp", -1)); надо указать свой указатель.
Указатель (хендл) вещь индивидуальная и зависит от операцинки. В кликермане он получается непосредственно самим пользователем с помощью альт ц один раз и не может быть изменен в процессе работы скрипта, то есть возможна работа только с одним окном и все, а в киборе он указывается в скрипте и можно их указать для каждого окна отдельно.
ArtChemist пишет: в игру тоже не получается посылать клики
А никто не говорил что такая эмуляция будет работать везде. Тут как программист игры захочет. Это касается не только Кибор но и других программ, того ж самого кликермана, использующего такую эмуляцию. Механизм у них один и другого нет. ... |
|
|
Kibor |
Отправлено: 18 Августа, 2013 - 12:55:39
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
ArtChemist пишет: вот например кусочек кода, должен кликать по иконке персонажа:
CODE:
win w=window (-1, -1, window ("Illodemiur", "SunAwtFrame", -1));
sendmouse(LEFT, 27, 118, w);
В этой игре мышь воспринимается в координатах начиная с левого верхнего угла ЭКРАНА.
Это даже можно проверить в том же кликмане.
Если сначала привязать окно, а потом написать скрипт клика по любой кнопке игры в КЛИЕНТСКИХ координатах, которые предлагает кликман, то скрипт будет работать только если игра на весь экран и кнопка большая, что компенсирует смещение на рамку окна, так как клиентские и оконные почти совпадают. Если сдвинуть то не будет работать. У вас кликман работал потому что вы писали скрипт в экранных координатах, а потом привязывали окно. Попробуйте сдвинуть его и запустить скрипт опять... Или попробуйте отправить в кликмане клик в свернутое окно, даже если в развернутом он кликал в окне на заднем плане.
Это особенность этой игры. В Кибор вы сразу писали в клиентских исходя из данных в шпионе, поэтому просто не попадал клик по координатам.
Ниже приведу примеры как надо программировать мышь в этой игре. Работает в свернутом тоже.
Для работоспособности скрипта в Кибор при любом сдвиге окна можно поступить так:
Пример поиска и клика по картинке в игре:
Способ первый:
CODE:win w=window ("Illodemiur", "SunAwtFrame", -1);
int col, x, y;
getdisplay(col, x, y);
findimage(1, #Image_0[0][0], 0, #PosX_0[0], #PosY_0[0], 0, 0, x, y, -1);//Поиск ведется по всему экрану. Координаты получаются экранные
sendmouse(LEFT, PosX_0[0], PosY_0[0], w);//клик в экранных координатах
Способ второй:
CODE:win w=window ("Illodemiur", "SunAwtFrame", -1);
int col, x, y;
getdisplay(col, x, y);
findimage(1, #Image_0[0][0], 0, #PosX_0[0], #PosY_0[0], 0, 0, x, y, w);//Поиск ведется в оконном режиме в окне игры. Координаты получаются клиентские
sendmouse(LEFT, PosX_0[0]+w.leftclient, PosY_0[0]+w.topclient, w);//клик в клиентских координатах со сдвигом на позицию клиентской части окна относительно экрана. В итоге получаем экранные координаты.
Пример клика по клиентским координатам которые получили в шпионе. Не зависит того свернуто оно или сдвинуто. Ну естественно что окно не должно сдвигаться после получения указателя на игру:
CODE:win w=window ("Illodemiur", "SunAwtFrame", -1);
sendmouse(LEFT, 1196+w.leftclient, 436+w.topclient, w);//клик в клиентских координатах полученных в шпионе со сдвигом на позицию клиентской части окна относительно экрана. В итоге получаем экранные координаты.
Будьте внимательны к координатам и указателям. |
|
|
Kibor |
Отправлено: 18 Августа, 2013 - 13:20:26
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Описка во втором способе..
Цитата: win w=window ("Illodemiur", "SunAwtFrame", -1);
int col, x, y;
getdisplay(col, x, y);
findimage(1, #Image_0[0][0], 0, #PosX_0[0], #PosY_0[0], 0, 0, x, y, w);//Поиск ведется в оконном режиме в окне игры. Координаты получаются клиентские
sendmouse(LEFT, PosX_0[0]+w.leftclient, PosY_0[0]+w.topclient, w);//клик в клиентских координатах со сдвигом на позицию клиентской части окна относительно экрана. В итоге получаем экранные координаты.
Надо указать указатель w а не -1... поправил.. |
|
|
|