@marusa122
Потому что ты сделала
результат работы ControlGet условием для работы всего остального кода.
Если окно свёрнуто, или неактивно, тогда соответственно
ControlGet НЕ обнаруживает кнопку - условие
НЕ выполняется, и
ВЕСЬ код внутри скобок
if !OutputVar НЕ работает.
И не будет работать. Пока окно не будет развёрнуто/активировано
руками.
Смысл моего кода был в том, что окно СНАЧАЛА делается активным, а уже ЗАТЕМ в активном окне ищется кнопка.
Одна только эта затея уже дурацкая сама по себе - у меня тоже окно
другой программы бесконечно мелькало, и не давало пользоваться другими окнами.
marusa122 wrote: ↑29 Dec 2023, 04:45
Как это исправить?
Я не знаю. Какой то дурацкий алгоритм. Его условия - взаимоисключающие.
Я не понимаю как работает окно в твоей программе. Мне затруднительно что то предпринимать не имея доступа к этому окну. Только так можно попытаться понять логику его работы.
Пока что я вижу только такое решение:
Раз попытка имплементации автоматической активации окна
провалилась - избавимся от неё совсем.
Тебе придётся руками разворачивать свёрнутое окно - по другому (пока что) никак.
В скрипте оставим проверку и
1. наличия окна, и
2. его активности.
И только после выполнения обоих условий скрипт будет проверять наличие КНОПКИ в окне.
Других вариантов я пока не вижу.
Code: Select all
#Requires Autohotkey v1.1
#SingleInstance, force
#NoEnv
ProgramName := "Program1"
TitleName := "Диалоговая форма"
TitleClass := "ahk_class WindowsForms10.Window.8.app.0.329445b_r8_ad1"
WindowTitle := TitleName . A_Space . TitleClass
ButtonName := "WindowsForms10.Window.8.app.0.329445b_r8_ad184"
CtrlCommand := "Visible"
Loop
{
Sleep, 1000
WinWait, % WindowTitle
if !ErrorLevel
{
while WinExist( WindowTitle )
{
if WinActive( WindowTitle )
{
;;; WinActivate, % WindowTitle
ControlGet, OutputVar, % CtrlCommand,, % ButtonName, % WindowTitle
if !(OutputVar)
{
MsgBox, 262160, % ProgramName, % "Готово"
break
}
Sleep, 1000
}
}
}
}
!+x::ExitApp ; {Alt}{Shift}{X}
ЗЫ. По хорошему, условие
if !ErrorLevel в этом коде вообще ЛИШНЕЕ.
Потому что
WinWait без таймаута и так будет ждать окно
до бесконечности.
И только когда окно, подходящее по условию проверки, «материализуется», только тогда код ниже будет выполнен.
А технически, внутри
WinWait, в цикле выполняется та же самая проверка
if WinExist().
Просто это делает скомпилированный машинный код самого Autohotkey, оптимизированный для работы с операционной системой.