Prosto |
Отправлено: 09 Февраля, 2020 - 23:11:22
|
Прохожий
Покинул форум
Сообщений всего: 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) |
|
|
Zireael |
Отправлено: 10 Февраля, 2020 - 01:55:09
|
Эксперт
Покинул форум
Сообщений всего: 4466
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Проблема в том что на кнопку можно нажать только если она имеет фокус. Т. е. сначала на неё надо кликнуть правой кнопкой мыши. Но, это не самая большая проблема, у кнопки нет имени и класс окна меняется, так что сначала надо найти хендл кнопки, а потом кликать.
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) |
|
|
Prosto |
Отправлено: 10 Февраля, 2020 - 11:42:26
|
Прохожий
Покинул форум
Сообщений всего: 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) |
|
|
Zireael |
Отправлено: 10 Февраля, 2020 - 12:02:32
|
Эксперт
Покинул форум
Сообщений всего: 4466
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: что происходит в этих строках, что значат цифры 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. |
|
|
|