Что нового

Подчиненные окна

Vlasssov

Осваивающий
Сообщения
428
Репутация
25
Вопрос такой назрел..
Если работать с окном программы в фоновом режиме, то может случиться такая ситуция (у меня случилась), что в скрипте надо предусмотреть ожидание окна. Функция winwait, как я понял, предполагает ожидание окна с заданным заголовком, и у нее нет параметров, которые бы указывали, что ожидаемое окно, должно быть подчиненном к другому окну...

То есть окно в программе работающей в фоне открывается... Но скрипт будет просматриват ВСЕ окна... Могла бы спасти функция
WinwaitActive - но Главное окно неактивно... Может есть какой хитрый способ добиться, что скрипт ждал появление подчиненного окна?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 702
Ничего не понял. Чем WinWait() не устраивает? Если есть несколько окон с одинаковым заголовком, то можно проверить процесс для этого окна с помощью функции WinGetProcess().
 
Автор
Vlasssov

Vlasssov

Осваивающий
Сообщения
428
Репутация
25
Yashied сказал(а):
Ничего не понял. Чем WinWait() не устраивает? Если есть несколько окон с одинаковым заголовком, то можно проверить процесс для этого окна с помощью функции WinGetProcess().
Вот этим и не устраивает.. Открывается в фоне окно, стандартное окно открытия файлов, таких окон при работе в фоновом состоянии может быть уйма... Работает в фоне скрипт, а пользователь в другой программе открывает "Открыть файл"... И скрипт продолжает работу, когда нашел такое окно, а вот найти он его должен в нужном фоновом приложении...
WinGetProcess - дает pid окна проложения... То есть у всех подчиненных окон, в том же notepad будет одинаковый pid?

Код:
Run("notepad.exe")
$pid = WinGetProcess("[CLASS:Notepad]")
MsgBox(0, "PID is", $pid)
send('^s')
$pid = WinGetProcess("Сохранить как")
MsgBox(0, "PID is", $pid)

Почему-то pid показывает -1 :shok:

Код:
Run("notepad.exe")
winwait("[CLASS:Notepad]")
$pid = WinGetProcess("[CLASS:Notepad]")
MsgBox(0, "PID is", $pid)
send('^s')
winwait("Сохранить как")
$pid = WinGetProcess("Сохранить как")
MsgBox(0, "PID is", $pid)
Хм... Вроде показывает одинаковый... То есть для ожидания окна в фоне надо перебрать все окна? А если autoIt нашел определенное окно а оно не то, как он надет другое? Вот еслибы бы была конструкция типа
Код:
winwait($pid,"Сохранить как")

То тогда - нет проблем... А так - просматривать весь список открытых окон по нескольку раз пока окно не откроется? :shok: Я что-то даже никак не представлю как это реализовать... :'(
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Vlasssov сказал(а):
То есть у всех подчиненных окон, в том же notepad будет одинаковый pid?
да. такие окна наз-ся дочерними ;D и дочерние окна покажут один и тот же pid при опросе через
Код:
WinGetProcess()

Vlasssov сказал(а):
Почему-то pid показывает -1
потому что функция выполнена с ошибкой. поставь небольшую задержку. попробуй такой код
Код:
Run("notepad.exe")
Sleep(1000)
$pid1 = WinGetProcess("[CLASS:Notepad]")
;MsgBox(0, "PID is", $pid)
send('^s')
Sleep(3000)
$pid2 = WinGetProcess("Сохранить как")
MsgBox(0, "PID is", 'pid через опрос главного окна - ' & $pid1 & @CRLF & 'pid через опрос дочернего окна - ' & $pid2)
 
Автор
Vlasssov

Vlasssov

Осваивающий
Сообщения
428
Репутация
25
Уже ответил... ;)


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

Код:
Run("notepad.exe")
winwait("[CLASS:Notepad]")
WinSetState("[CLASS:Notepad]", "", @SW_HIDE)
send("Вася")
$aWin = WinList()
$pid = WinGetProcess("[CLASS:Notepad]")
$f=0
send("^s")
Do
For $i = 1 to $aWin[0][0]
  $pid1 = WinGetProcess($aWin[$i][0])
  If ($pid = $pid1) And ($aWin[$i][1] = "Сохранить как") Then
   $f=1
   exit For
  EndIf
Next
until $f=0
send("Вася1")
send("{Enter}")
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 702
Vlasssov сказал(а):
Функция winwait, как я понял, предполагает ожидание окна с заданным заголовком, и у нее нет параметров, которые бы указывали, что ожидаемое окно, должно быть подчиненном к другому окну...
Вот написал функцию _WinWaitOwner() специально для таких ситуаций.

:smile:
 
Автор
Vlasssov

Vlasssov

Осваивающий
Сообщения
428
Репутация
25
Проблема с подчиненными окнам продолжается. При вызове окна внутри программы - оно всё равно становится активным!!! То есть выглядит это так - основное окно скрыто, а при открытии подчиненного окна оно показывается на экране...
Как сделать, чтобы программа полностью работала как hide, и все подчиненные окна тоже изначально имели атрибут hide?
 
Верх