Кибор » Кибор - Интегрированная среда разработки ботов » Вопросы и решение проблем » Клик на кнопку в Excel

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

1. Prosto - 09 Февраля, 2020 - 15:11:22 - перейти к сообщению
Не могу добиться срабатывания кнопки в неактивном окне 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:(для просмотра ссылки Вам необходимо авторизоваться)
2. Zireael - 09 Февраля, 2020 - 17:55:09 - перейти к сообщению
Проблема в том что на кнопку можно нажать только если она имеет фокус. Т. е. сначала на неё надо кликнуть правой кнопкой мыши. Но, это не самая большая проблема, у кнопки нет имени и класс окна меняется, так что сначала надо найти хендл кнопки, а потом кликать.
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
3. Prosto - 10 Февраля, 2020 - 03:42:26 - перейти к сообщению
 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");]
4. Zireael - 10 Февраля, 2020 - 04:02:32 - перейти к сообщению
 Цитата:
что происходит в этих строках, что значат цифры 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.

Powered by ExBB FM 1.0 Final