Quantcast
Channel: AutoHotkey Community
Viewing all articles
Browse latest Browse all 579

Помощь • Re: Скрипт не всегда срабатывает

$
0
0
@marusa122
Потому что ты сделала результат работы ControlGet условием для работы всего остального кода.
Если окно свёрнуто, или неактивно, тогда соответственно ControlGet НЕ обнаруживает кнопку - условие НЕ выполняется, и ВЕСЬ код внутри скобок if !OutputVar НЕ работает.
И не будет работать. Пока окно не будет развёрнуто/активировано руками.

Смысл моего кода был в том, что окно СНАЧАЛА делается активным, а уже ЗАТЕМ в активном окне ищется кнопка.
Одна только эта затея уже дурацкая сама по себе - у меня тоже окно другой программы бесконечно мелькало, и не давало пользоваться другими окнами.


Как это исправить?

Я не знаю. Какой то дурацкий алгоритм. Его условия - взаимоисключающие.
Я не понимаю как работает окно в твоей программе. Мне затруднительно что то предпринимать не имея доступа к этому окну. Только так можно попытаться понять логику его работы.

Пока что я вижу только такое решение:
Раз попытка имплементации автоматической активации окна провалилась - избавимся от неё совсем.
Тебе придётся руками разворачивать свёрнутое окно - по другому (пока что) никак.
В скрипте оставим проверку и 1. наличия окна, и 2. его активности.
И только после выполнения обоих условий скрипт будет проверять наличие КНОПКИ в окне.
Других вариантов я пока не вижу.

CODE:

#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, оптимизированный для работы с операционной системой.

Statistics: Posted by vmech — 47 minutes ago



Viewing all articles
Browse latest Browse all 579

Trending Articles