Всем здравствуйте!
В целевой программе не работают Sendmouse. Появилась идея в основном цикле искать в окнах копий программы нужное изображение, при нахождении изображения в одном из них делать окно активным, отработать через mouse и вернуться в основной цикл поиска по окнам.
Подскажите, пожалуйста,
- как правильно делать окно активным?
- кибор знает координаты найденного изображения в окне, как правильно рассчитать экранные координаты для mouse?
Друзья, заранее спасибо! =)
1. mattallen - 16 Августа, 2021 - 15:36:34 - перейти к сообщению
2. Zireael - 16 Августа, 2021 - 18:02:51 - перейти к сообщению
CODE:
#define NULL 0
external(INT, "MapWindowPoints", "MapWindowPoints", "User32.dll");
int x = 200, y = 100; // допустим это координаты картинки
win w = window (-1, "Notepad", -1); // окно блокнота
if(w) // если окно найдено
{
int Points[2];
Points[0] = x; Points[1] = y;
MapWindowPoints(formatwi(w), NULL, address(#Points[0]), 1); // пересчитать координаты в экранные
activate(w); // активировать окно
pause(1000);
mousemove(Points[0], Points[1]); // навести курсор
}
else messagebox("Окно не найдено");
external(INT, "MapWindowPoints", "MapWindowPoints", "User32.dll");
int x = 200, y = 100; // допустим это координаты картинки
win w = window (-1, "Notepad", -1); // окно блокнота
if(w) // если окно найдено
{
int Points[2];
Points[0] = x; Points[1] = y;
MapWindowPoints(formatwi(w), NULL, address(#Points[0]), 1); // пересчитать координаты в экранные
activate(w); // активировать окно
pause(1000);
mousemove(Points[0], Points[1]); // навести курсор
}
else messagebox("Окно не найдено");
3. mattallen - 17 Августа, 2021 - 09:04:56 - перейти к сообщению
Zireael пишет:
CODE:
#define NULL 0
external(INT, "MapWindowPoints", "MapWindowPoints", "User32.dll");
external(INT, "MapWindowPoints", "MapWindowPoints", "User32.dll");
Всё заработало. Огромное спасибо!
4. mattallen - 19 Августа, 2021 - 06:32:08 - перейти к сообщению
Zireael пишет:
CODE:
#define NULL 0;
Возникла проблема.
Если выполнение скрипта остановить и запустить снова, левый верхний угол окна (координаты 0,0) начинает отсчитываться от координат, где был клик мышкой по форме для ввода текста в этом окне.
Перезапуском кибора не лечится. Лечится если закрыть окно целевой программы и снова открыть.
Как сбросить эту глобальную переменную опять в реальные нулевые координаты окна? Помогите.
5. Zireael - 19 Августа, 2021 - 06:36:31 - перейти к сообщению
Клик мышкой к получению координат никакого отношения не имеет. Ошибка где-то в вашем коде.
6. mattallen - 19 Августа, 2021 - 06:45:55 - перейти к сообщению
Zireael пишет:
Клик мышкой к получению координат никакого отношения не имеет. Ошибка где-то в вашем коде.
Простите, но я использовать ваш код, в котором изменил название окна на своё.
(Добавление)
Zireael пишет:
Клик мышкой к получению координат никакого отношения не имеет. Ошибка где-то в вашем коде.
Screen и saveimage наглядно показывают смещение координаты. Хочу обратить внимание, что клик по кнопке не меняет эту глобальную переменную. Меняет клик по форме для ввода текста.
(Добавление)
1.bmp - результат первой итерации скрипта, 2.bmp - второй.
Скрытый текст:
Для просмотра Вам необходимо авторизоваться и оставить не менее 200 сообщений
Код использовался:
CODE:
#define NULL 0
external(INT, "MapWindowPoints", "MapWindowPoints", "User32.dll");
int s[3000][3000];
win boxs[1];
boxs[0] = window ("Nox", "Qt5QWindowIcon", window ("Tasya", "Qt5QWindowIcon", -1));
//loop(){
for (int a=0; a<sizearray(boxs); a++)
{
activate(boxs[a]); // активировать окно
pause(2000);
mouseleft(262,575,boxs[a]); //click to insert captcha
screen (#s[0][0], 0, 0, 565, 964, boxs[a]);
saveimage(#s[0][0], "E:\Downloads\kibor_set\1.bmp");
}
//} //loop
function mouseleft(int x, int y, win box)
{
int Points[2];
Points[0] = x; Points[1] = y;
MapWindowPoints(formatwi(box), NULL, address(#Points[0]), 1); // пересчитать координаты в экранные
mousemove(Points[0], Points[1]); // навести курсор
mouse(LEFT, Points[0], Points[1]);
}
#define NULL 0
external(INT, "MapWindowPoints", "MapWindowPoints", "User32.dll");
int s[3000][3000];
win boxs[1];
boxs[0] = window ("Nox", "Qt5QWindowIcon", window ("Tasya", "Qt5QWindowIcon", -1));
//loop(){
for (int a=0; a<sizearray(boxs); a++)
{
activate(boxs[a]); // активировать окно
pause(2000);
mouseleft(262,575,boxs[a]); //click to insert captcha
screen (#s[0][0], 0, 0, 565, 964, boxs[a]);
saveimage(#s[0][0], "E:\Downloads\kibor_set\1.bmp");
}
//} //loop
function mouseleft(int x, int y, win box)
{
int Points[2];
Points[0] = x; Points[1] = y;
MapWindowPoints(formatwi(box), NULL, address(#Points[0]), 1); // пересчитать координаты в экранные
mousemove(Points[0], Points[1]); // навести курсор
mouse(LEFT, Points[0], Points[1]);
}
7. Zireael - 19 Августа, 2021 - 17:45:17 - перейти к сообщению
CODE:
win boxs[1];
boxs[0] = window ("Nox", "Qt5QWindowIcon", window ("Tasya", "Qt5QWindowIcon", -1));
messagebox(formatwi(boxs[0]));
boxs[0] = window ("Nox", "Qt5QWindowIcon", window ("Tasya", "Qt5QWindowIcon", -1));
messagebox(formatwi(boxs[0]));
Запустить этот код, запомнить хендл окна, кликнуть на картинку или куда там делается клик, снова запустить код, скорее всего хендл будет отличаться.
8. mattallen - 20 Августа, 2021 - 07:47:06 - перейти к сообщению
Zireael пишет:
CODE:
win boxs[1];
boxs[0] = window ("Nox", "Qt5QWindowIcon", window ("Tasya", "Qt5QWindowIcon", -1));
messagebox(formatwi(boxs[0]));
boxs[0] = window ("Nox", "Qt5QWindowIcon", window ("Tasya", "Qt5QWindowIcon", -1));
messagebox(formatwi(boxs[0]));
Запустить этот код, запомнить хендл окна, кликнуть на картинку или куда там делается клик, снова запустить код, скорее всего хендл будет отличаться.
Такой же как первоначальный. Идентичное имя.
9. Zireael - 20 Августа, 2021 - 17:46:00 - перейти к сообщению
С блокнотом этот код работает.
10. mattallen - 21 Августа, 2021 - 06:10:29 - перейти к сообщению
Zireael пишет:
С блокнотом этот код работает.
Согласен. Проблема изначально в киборе, который по какой-то причине получает или отдает фейковые 0,0 координаты окна. Придется написать костыль.