Что нового

Скрипт не находит окно

Boris76

Новичок
Сообщения
10
Репутация
0
Задача такова: в 2-х филиалах проверять наличие файлов в определённых папках
и перекидывать их в центральный офис. Для этого в филиалах установлена программа
Ammyy (Free-версия) как служба в режиме "File Manager only".
Из центрального офиса вручную всё работает прекрасно. Но надо эти действия
проводить несколько раз в сутки. Для этого написан скрипт на Autoit и он
нормально отрабатывает. Но только при открытой сессии RDP. (В силу некоторых
причин скрипт должен работать обязательно на сервере, а там физически нет
монитора, т.е. вход на сервер - только по RDP).
Так вот, выяснилось, что если в начале скрипта поставить паузу, запустить
и выйти из RDP-сессии, то главное окно Ammyy открывается, а скрипт его не находит!
(Хэндл окна = 0) Затем команда WinGetPos не может определить координаты окна
и естественно всё на этом заканчивается. Причём окно активно, т.е. является
самым верхним из всех окон. Запускал скрипт из-под учётки администратора.
Вопрос: почему при закрытой RDP-сессии скрипт не находит главное окно приложения?
И можно ли это как-то победить?

Это текст скрипта:
Код:
Global $ID = 16813154
Global $titulFM = $ID & " - File Explorer"
Global $size[4]
Global $size1[4]
Global $hWnd
Global $hWnd1
Global $fout
Global $stroka


Sleep(60000)	;1 minuta
$fout = FileOpen ( "protocol.txt" ,1 )
;MsgBox(0,"fout=", $fout, 5)

;Opt("GUIOnEventMode", 1)
Opt("WindowTitleMatchMode",3)

Run("AA_v3.exe")
Sleep (5000)
   $hWnd = WinWaitActive("Ammyy Admin v3.0 - Free", "", 10)
  FileWrite($fout, "hWnd= " & $hWnd & " ")
   $size = WinGetPos($hWnd)
   FileWrite($fout, " size= " & $size[0] & " " & $size[1] & " ")
   
;   MsgBox(0, "Active window stats (x,y,width,height):", $size[0] & " " & $size[1] & " " & $size[2] & " " & $size[3])
;   MsgBox (0, "hWnd=", $hWnd, 5)
   MouseMove ( $size[0]+400, $size[1]+130, 100 )	; "ID of client"
   MouseClick ( "left" )
   Sleep(2000)
   Send("{BS}")
   Send("{BS}")
   Send("{BS}")
   Send("{BS}")
   Send("{BS}")
   Send("{BS}")
   Send("{BS}")
   Send("{BS}")
   Send("{BS}")
   Send("{BS}")
   Send($ID)
;  Send("{Enter}")
   MouseMove ( $size[0]+350, $size[1]+240, 100 )	; "connect"
   MouseClick ( "left" )
;   ControlClick ("Ammyy Admin v3.0 - Free", "", 1507 )
   Sleep (5000)

   $hWnd1 = WinWaitActive($titulFM, "", 10)
   FileWrite($fout, "hWnd1= " & $hWnd1 & " ")
   $size1 = WinGetPos($hWnd1)
   FileWrite($fout, " size1= " & $size1[0] & " " & $size1[1] & " ")

   FileClose($fout)


Это содержимое файла-протокола при работе из RDP-сессии:
hWnd= 0x00000000000504A4 size= 44 44 hWnd1= 0x00000000000304F0 size1= 128 96

Т.е. видно, что и главное окно было найдено и следующее.

А это содержимое файла-протокола при работе без RDP-сессии:
hWnd= 0

Если кто сталкивался с такой проблемой, прошу помочь советом.
Спасибо.
 

rollin

Новичок
Сообщения
15
Репутация
1
Re: Скрипт не находит активное окно

К сожалению, никогда не работал с Ammyy, но попробую высказать свое предположение...
Заголовок главного окна Ammyy без rdp и с ней одинаковый? Всегда "Ammyy Admin v3.0 - Free"??
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Re: Скрипт не находит активное окно

Кто-то жаловался при решении подобной задачи (кажется делать скрины окон), что окна просто не существуют, что-то в этом роде...
 

InnI

AutoIT Гуру
Сообщения
4,950
Репутация
1,445
Re: Скрипт не находит активное окно

WSWR [?]
кажется делать скрины окон
Это было здесь: http://autoit-script.ru/index.php/topic,12491


Добавлено:
Сообщение автоматически объединено:

Boris76, при свёрнутой (отключённой) сессии окна запущенных из скрипта приложений не активируются. Поэтому попробуйте через
Код:
WinWait()
ControlSend()
 
Автор
B

Boris76

Новичок
Сообщения
10
Репутация
0
Re: Скрипт не находит активное окно

1. Заголовок главного окна Ammyy - всегда одинаковый. Проверено много раз!

2. Откуда я знаю, что главное окно открывается? Я его вижу, когда через некоторое время
опять вхожу по RDP! (На копирование файлов у скрипта уходят считанные секунды).

3. Как я определил, что окно является самым верхним? При повторном входе по RDP
я вижу, что самым верхним является окно с сообщением об ошибке "error: subscript
used with non-Array variable" -это говорится про команду

FileWrite($fout, " size= " & $size[0] & " " & $size[1] & " ")

т.к. здесь впервые встречается переменная $size, и хотя она описана у меня как
массив, так всегда ругается в случае, если не смогла выполниться команда
$size=WinGetPos($hWnd).
A эта команда не выполнилась потому, что hWnd=0 (в файле протокола это у меня сохранено).
Короче, когда щёлкаю мышью по этому окну с ошибкой, оно исчезает, и тогда самым
верхним является главное окно Ammyy. Из этого я делаю вывод, что перед ошибкой оно
было самым верхним.

4. По ссылке прочитал про чёрные скриншоты. Да, у меня тоже скриншоты не получалось
сделать. Да, там правильно написано про клиента RDP, что он самостоятельно рисует окно.
Но мне после запуска скрипта (я по окну диспетчера задач всегда проверяю, что новый
процесс появился, и только потом выхожу) не надо видеть, что там происходит, - вот я
его и закрываю. А на том компьютере система Windows должна работать как обычно:
в списке окон должны отражаться все открытые окна! И стало быть в этом списке их
можно найти... (Даже можно работать со скрытыми окнами!) Но это уже другая тема,
а тут - не находит самое обычное (и самое верхнее) окно!
Очевидно, что как-то это связано всё же с RDP. Может, родительское окно
пропадает? Ну и что? Главное окно Ammyy я вижу при повторном входе!

Там по ссылке человек решил проблему с помощью второго монитора, а у меня
ни одного нет!
 

InnI

AutoIT Гуру
Сообщения
4,950
Репутация
1,445
Re: Скрипт не находит активное окно

Boris76 [?]
самое обычное (и самое верхнее) окно
Самое верхнее ещё не означает, что оно активное.
с помощью второго монитора, а у меня ни одного нет
Монитор нужен на стороне клиента, а не сервера. Или вы после закрытия окна RDP и монитор отключаете и уносите?
 

rollin

Новичок
Сообщения
15
Репутация
1
Re: Скрипт не находит активное окно

Код:
$hWnd = WinWaitActive("Ammyy Admin v3.0 - Free", "", 10)

Пробовал ставить тайм-аут побольше? Может из-за закрытия сессии окно создается дольше.

Кстати, InnI очень даже прав насчет активации окон - проверено практикой.
 
Автор
B

Boris76

Новичок
Сообщения
10
Репутация
0
Re: Скрипт не находит активное окно

Чтобы исключить версию "родительского окна" сделал следующее:
- скрипт откомпилировал в ехе-шник,
- сделал батник из которого вызываю этот ехе-шник,
- перед вызовом ехе-шника делаю паузу таким образом:
"ping -n 60 127.0.0.1 > null"
- запустил cmd.exe от имени администратора, встал в папку
со своими скриптами и запустил этот батник,
- в окне диспетчера задач убедился, что процесс PING появился,
а процесс Autoit - ещё нет! И я вышел из RDP-сессии и перед
выходом посворачивал абсолютно все окна, и когда
скрипт запустится, у него родительское окно никак не может быть
связано с RDP!
Но всё равно скрипт не находит главное окно Ammyy!
 
Автор
B

Boris76

Новичок
Сообщения
10
Репутация
0
Re: Скрипт не находит активное окно

Попробовал тайм-аут = 60 секунд =не помогло!
Да, похоже, что окно пояляется, но оно не активно!
Сделал WinActivate() - не помогло!
Сделал через WinWait(), 60 секунд и через батник - не помогло!

Неужели придётся просить админа принести туда ненадолго монитор, чтобы один раз
войти локально и запустить скрипт (а внутри скрипта сделать вечный цикл)?
А если потом понадобится чего-нибудь поменять в скрипте? Опять с монитором
таскаться? Да меня админ на смех поднимет...
Не может быть чтобы Винда была так тупо сделана...
 

InnI

AutoIT Гуру
Сообщения
4,950
Репутация
1,445
Re: Скрипт не находит активное окно

Boris76 [?]
Да меня админ на смех поднимет
Пробуйте
Код:
Global $ID = "16813154"
Global $hWnd
Global $hWnd1

Run("AA_v3.exe")
$hWnd = WinWait("Ammyy Admin", "", 10)

ControlSetText($hWnd, "", "Edit3", $ID)
ControlClick($hWnd, "", "Button4")

$hWnd1 = WinWait($ID, "", 10)
 
Автор
B

Boris76

Новичок
Сообщения
10
Репутация
0
Re: Скрипт не находит активное окно

Да, так работает! Молодец, InnI! От меня почёт и уважуха! А уж было собрался через утилиту
PSexec удалённо скрипт запускать...
Тему можно закрывать, только переименовать (убрать слово "активное" из названия темы) :beer:
 

rollin

Новичок
Сообщения
15
Репутация
1
Re: Скрипт не находит активное окно

Boris76
ты автор - тебе и закрывать ;)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: Скрипт не находит активное окно

Boris76 [?]
Тему можно закрывать, только переименовать (убрать слово "активное" из названия темы)
Переименуйте.

[info border=#0000ff float=left]На форуме принято помечать тему решенной после получения ответа на свой вопрос!
Вверху или внизу темы нажмите на ссылку такого вида:
package_old.gif
Тема не решена
[/info]
 
Верх