Что нового

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

vcomp71

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

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

Yashied

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

vcomp71

Осваивающий
Сообщения
431
Репутация
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
Репутация
626
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)
 
Автор
vcomp71

vcomp71

Осваивающий
Сообщения
431
Репутация
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,724
Vlasssov сказал(а):
Функция winwait, как я понял, предполагает ожидание окна с заданным заголовком, и у нее нет параметров, которые бы указывали, что ожидаемое окно, должно быть подчиненном к другому окну...

Вот написал функцию _WinWaitOwner() специально для таких ситуаций.

:smile:
 
Автор
vcomp71

vcomp71

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