Что нового

Окна, Диалоги Как достоверно определить, что активное окно "развисло" (стало активным, доступным)

fduch

Новичок
Сообщения
3
Репутация
0
Здравствуйте.
Есть такая задача.
1. Список заказов копирую из Excel в буфер обмена и сохраняю в массив.
2. Через цикл пробегаю по массиву и ищу заказы в ERP системе с целью их последовательного удаления.
3. В момент удаления окно зависает на некоторое время - и это время варьируется от одной до 20 секунд.
4. Чтобы вставить другой номер из массива нужно четко определить, что окно развисло. Ждать по 20 секунд не вариант.
Подскажите приём, как четко определить доступность окна для следующей итерации?

Пытался отследить курсор, "While MouseGetCursor = 14", но он не всегда меняется с четкой закономерностью.
Вроде как можно отслеживать кусочек экрана как "картинку".
Подскажите - как это сделать. Или может есть более элегантный способ.

Спасибо заранее!
 

Oki

Продвинутый
Сообщения
452
Репутация
62
Если не найдётся более прямой способ, то можно попробовать такую последовательность действий, предварительно сохранив текст в переменную: скопировать в буфер обмена, попытаться вставить в окно, очистить буфер обмена, попытаться прочесть из окна в буфер обмена, сравнить с сохранённым в переменной. Повторять в цикле до успеха, после которого запускать в работу. С поиском нужных цветов пикселей на экране, конечно, можно играться, но подобрать удачный критерий для алгоритма может оказаться трудно.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Пытаюсь сделать вот так
Похоже, эта функция срабатывает когда окно уже какое-то время не отвечает. Попробуйте добавить Sleep на пару-тройку секунд перед циклом.
Вот ещё вариант проверки
Код:
#include <WinAPISysWin.au3>

$Sec = 20
$hWnd = WinGetHandle("Title")
For $i = 1 To $Sec
  If _WinAPI_SendMessageTimeout($hWnd, 0) <> -1 And Not @extended Then ExitLoop
Next
If $i > $Sec Then ConsoleWrite("Timeout" & @CRLF)
 

Oki

Продвинутый
Сообщения
452
Репутация
62
Похоже, эта функция срабатывает когда окно уже какое-то время не отвечает. Попробуйте добавить Sleep на пару-тройку секунд перед циклом.
Из справки следует, что только после 5 секунд начинает срабатывать.
 
Автор
F

fduch

Новичок
Сообщения
3
Репутация
0
У меня все работает хорошо когда я жду 7 секунд, потом отслеживаю курсор "песочные часы" и когда он исчезает иду далее.
AutoIt код:
Sleep(7000)                           
While MouseGetCursor = 14               
Sleep(500)                               
WEnd

Просто хотел сделать более универсальную штуку, т.к. 7 секунд не всегда обязательно ждать.

Спасибо за участие, коллеги.
 
Верх