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

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

 Страниц (1): [1]   

> Без описания
Prosto
Отправлено: 09 Февраля, 2020 - 23:11:22
Post Id



Пользователь
Прохожий


Покинул форум
Сообщений всего: 5
Дата рег-ции: Янв. 2020  
Репутация: 0




Не могу добиться срабатывания кнопки в неактивном окне Excel.
CODE:
button(1,window (-1, "F3 Server e2ce0000", 276, 175, -1, -1, window ("Книга1 - Excel", "XLMAIN", -1)));
win wind = window (-1, "F3 Server e2ce0000", 276, 175, -1, -1, window ("Книга1 - Excel", "XLMAIN", -1));
sendmousedbl (LEFT, 338, 57, wind);
sendkey(13, wind); //Enter

Кнопку находит - выделяется, но клика не происходит.
Аналогично и в активном окне и с кликом по изображению.
Подскажите как одолеть?
Файл Excel: https://yadi.sk/i/atPahLWHGNaawA

(Отредактировано автором: 09 Февраля, 2020 - 23:15:22)

 
 Top
Zireael
Отправлено: 10 Февраля, 2020 - 01:55:09
Post Id



Пользователь
Эксперт


Покинул форум
Сообщений всего: 4397
Дата рег-ции: Нояб. 2017  
Репутация: 580




Проблема в том что на кнопку можно нажать только если она имеет фокус. Т. е. сначала на неё надо кликнуть правой кнопкой мыши. Но, это не самая большая проблема, у кнопки нет имени и класс окна меняется, так что сначала надо найти хендл кнопки, а потом кликать.
CODE:
#define GW_CHILD 5
#define GW_HWNDNEXT 2
external(INT, "GetWindow", "GetWindow", "User32.dll");
external(INT, "GetClassName", "GetClassNameA", "User32.dll");

char class[999];
string tmp;


win w=window ("Книга1.xlsm", "EXCEL7", window ("Книга1.xlsm - Excel", "XLMAIN", -1)); // лист excel
if(w) // если окно найдено
{
sendmouse(RIGHT, 340, 60, w); // клик по кнопке Старт, чтобы она получила фокус
//sendmouse(RIGHT, 340, 120, w); // клик по кнопке Очистка
sleep(300); // пауза

int h=GetWindow(formatwi(w), GW_CHILD); // получтить хендл дочернего окна
while(h)
{
//messagebox(h);
h=GetWindow(h, GW_HWNDNEXT); // получить хендл следующего окна
GetClassName(h, address(#class[0]), sizearray(class)); // узнать класс окна
if(regexsearch(1, #tmp, format(#class[0]), "F3 Server"))break; // если в имени есть 'F3 Server' выход из цикла
}

if(h)sendmouse(LEFT, 65, 20, formatiw(h)); // клик по кнопке
}

https://radikal.ru/big/6vkj82tls0uqa

(Отредактировано автором: 10 Февраля, 2020 - 01:55:38)

 
 Top
Prosto
Отправлено: 10 Февраля, 2020 - 11:42:26
Post Id



Пользователь
Прохожий


Покинул форум
Сообщений всего: 5
Дата рег-ции: Янв. 2020  
Репутация: 0




 Zireael пишет:
Проблема в том что на кнопку можно нажать только если она имеет фокус. Т. е. сначала на неё надо кликнуть правой кнопкой мыши. Но, это не самая большая проблема, у кнопки нет имени и класс окна меняется, так что сначала надо найти хендл кнопки, а потом кликать.
https://radikal.ru/big/6vkj82tls0uqa

Zireael спасибо большое!
Можно узнать, получить простое объяснение, что происходит в этих строках, что значат цифры 5, 2 , где брать? Я конечно погуглил, но так программист начинающий, то и понимания соответственно
CODE:
#define GW_CHILD 5
#define GW_HWNDNEXT 2
external(INT, "GetWindow", "GetWindow", "User32.dll");
external(INT, "GetClassName", "GetClassNameA", "User32.dll");]

(Отредактировано автором: 10 Февраля, 2020 - 11:43:26)

 
 Top
Zireael
Отправлено: 10 Февраля, 2020 - 12:02:32
Post Id



Пользователь
Эксперт


Покинул форум
Сообщений всего: 4397
Дата рег-ции: Нояб. 2017  
Репутация: 580




 Цитата:
что происходит в этих строках, что значат цифры 5, 2 , где брать?

#define - это объявление константы.
Значения обычно есть в описании функции. Например: https://docs.microsoft.com/en-us...inuser-getwindow
CODE:
#define GW_CHILD 5
messagebox(GW_CHILD);

Можно конечно вместо:
CODE:
int h=GetWindow(formatwi(w), GW_CHILD);

написать
CODE:
int h=GetWindow(formatwi(w), 5);

но, в первом варианте сразу понятно что именно хотим получить от функции, а во втором нет.

external - подключение функции из длл в данном случае из User32.dll.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« Вопросы и решение проблем »


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




Powered by