Скрипт не ищет кнопку Topic is solved

Помощь в написании скриптов
marusa122
Posts: 135
Joined: 22 Mar 2023, 07:48

Скрипт не ищет кнопку

12 Dec 2023, 05:25

Здравствуйте. Нужен скрипт, который должен проверять определенное окно (его наличие или отсутствие) и при наличии искать в нем определенную кнопку. Если кнопка НЕ найдена в этом окне, через 20 секунд должен появляться MsgBox "Готово".
Пробовала написать такой скрипт, но он не работает. Как это исправить?

Code: Select all

Loop
{
if WinExist("ahk_class Program1") ; если окно найдено
{
ControlGet, OutputVar, Visible,, Button1, Окно1 ; название окна и ClassNN кнопки
if (OutputVar)
    Continue
else ; если кнопки в данном окне не обнаружено
    Sleep 2000
    MsgBox % "Готово" ; ждем 20 секунд и показываем MsgBox 
	}
Else 
{
Continue ; если окно не найдено, начинаем проверку сначала
}
}
mcl
Posts: 357
Joined: 04 May 2018, 16:35

Re: Скрипт не ищет кнопку

12 Dec 2023, 11:10

marusa122 wrote: Пробовала написать такой скрипт, но он не работает. Как это исправить?
-2. Для начала проверьте фигурные скобки — хотя, похоже, в данном случае на работоспособности это не отразилось.
-1. У вас задержка в две секунды, а не в двадцать.
-0. После „Готово“, наверное, нужно выйти из цикла?

Как именно не работает: всегда говорит „Готово“, или, наоборот, никогда не говорит?
Что за программа, что за окно? Не браузер, случаем?
Пошагово отлаживать пробовали?
WinExist правильно определяет окно?
ControlGet находит кнопку, если она есть?

WinExist у Вас ищет окно по классу, а ControlGet — по названию. Возможно, проблема в этом? Попробуйте SetTitleMatchMode с другими настройками.
Если других окон, могущих смутить скрипт, не имеется, для ControlGet его вовсе можно не указывать (т.н. Last Found Window).
github://oGDIp - GDI+ wrapper for AHK v1.1
vmech
Posts: 356
Joined: 25 Aug 2019, 13:03

Re: Скрипт не ищет кнопку  Topic is solved

12 Dec 2023, 11:13

Попробуй так:

Code: Select all

Loop
{
    WinWait, % "ahk_class Program1",, 20  ; ждем окно 20 секунд
    if !ErrorLevel                      ; 1 если таймаут, иначе 0
    {
        ControlGet, OutputVar, Visible,, Button1    ; Окно1 не нужно, используй Last Found Window
        if (OutputVar)
            Continue
        else                    ; если кнопки в данном окне не обнаружено
        {
            Sleep, 1000          ; ждем 1 секунду
            MsgBox, % "Готово"   ; и показываем MsgBox
        }
    }
    ; если окно не найдено, начинаем проверку сначала
}
ЗЫ. Опять этот дурацкий синтаксис AHKv1... Забыл % в команде WinWait.
У меня этот код работает.
Только я использовал параметр "ahk_class CalcFrame" - это окно стандартного Калькулятора (ahk_exe win32calc.exe).
В нём есть кнопка с именем Button1, и она успешно обнаруживается.
Last edited by vmech on 12 Dec 2023, 12:16, edited 1 time in total.
Please post your script code inside [code] ... [/code] block. Thank you.
marusa122
Posts: 135
Joined: 22 Mar 2023, 07:48

Re: Скрипт не ищет кнопку

13 Dec 2023, 12:41

@vmech, попробовала скрипт, но он не работает. Возможно, проблема в том, что у отслеживаемой программы при запуске открывается первое окно с определенным ahk_class и определенным набором кнопок. И в какой-то момент рядом с ним открывается второе окно с таким же (!) ahk_class, но с другим набором кнопок. И ahk_exe у обоих окон одинаковый, конечно. Различие только в названиях (строка перед ahk_class). Отслеживаемая кнопка появляется во втором окне при его открытии и после определенных команд она скрывается. Но второе окно остается видимым (эта кнопка в нем скрывается вместе с рядом других кнопок).
Я пробовала вместо ahk_class указать просто название второго окна - он теперь при появлении второго окна начинает постоянно показывать MsgBox, даже если кнопка видима (а должен показывать его через 20 секунд после того, как кнопка скроется в этом окне).
vmech
Posts: 356
Joined: 25 Aug 2019, 13:03

Re: Скрипт не ищет кнопку

13 Dec 2023, 14:08

@marusa122
Покажи, что пишет WindowSpy. Про оба окна. Иначе можно очень долго «бродить вокруг, да около».
Spoiler
ЗЫ. Если не секрет, что это за программа ?
Please post your script code inside [code] ... [/code] block. Thank you.
marusa122
Posts: 135
Joined: 22 Mar 2023, 07:48

Re: Скрипт не ищет кнопку

14 Dec 2023, 00:40

@vmech,
vmech wrote:
13 Dec 2023, 14:08
ЗЫ. Если не секрет, что это за программа ?
Телефония Oktell.
vmech wrote:
13 Dec 2023, 14:08
Покажи, что пишет WindowSpy. Про оба окна. Иначе можно очень долго «бродить вокруг, да около».
Сведения от WindowSpy про первое (основное окно), которое открывается при запуске программы:
Spoiler
*тут тоже есть кнопка с аналогичным названием, но отслеживать нужно не ее, а кнопку во втором окне.
Сведения от WindowSpy про второе окно, которое открывается при начале звонка:
Spoiler
После завершения звонка второе окно остается на месте, но выделенная красным кнопка из него исчезает. Нужно, чтобы скрипт засекал момент, когда звонок завершен (и кнопка из этой формы пропала) и начинал отсчет времени. Через 20 секунд должен появляться MsgBox "Готово".
vmech
Posts: 356
Joined: 25 Aug 2019, 13:03

Re: Скрипт не ищет кнопку

14 Dec 2023, 02:21

@marusa122
Попробуй использовать "Диалоговая форма ahk_class WindowsForms10.Window.8.app.0.329445b_r8_ad1" в команде WinWait.

Исправил ☝☝☝ ДВАЖДЫ

Можно попробовать SetTitleMatchMode, 2, но это крайний случай, потому что это более медленный режим, и больше утилизирует CPU.

И Sleep, 20000 в ложной ветке if так же понадобится, судя по всему.
Last edited by vmech on 16 Dec 2023, 16:12, edited 2 times in total.
Please post your script code inside [code] ... [/code] block. Thank you.
marusa122
Posts: 135
Joined: 22 Mar 2023, 07:48

Re: Скрипт не ищет кнопку

14 Dec 2023, 08:32

@vmech, сейчас скрипт выглядит так:

Code: Select all

Loop
{
    WinWait, % "Диалоговое окно ahk_class WindowsForms10.Window.8.app.0.329445b_r8_ad1",, 5 
    if !ErrorLevel                      ; 1 если таймаут, иначе 0
    {
        ControlGet, OutputVar, Visible,, WindowsForms10.Window.8.app.0.329445b_r8_ad184
        if (OutputVar)
            Continue
        else                    ; если кнопки в данном окне не обнаружено
        {
            Sleep, 1000          ; ждем 1 секунду
            MsgBox, % "Готово"   ; и показываем MsgBox
        }
    }
    Sleep, 5000 ; если окно не найдено, начинаем проверку сначала
}
Но он не работает. Что я сделала не так?
vmech
Posts: 356
Joined: 25 Aug 2019, 13:03

Re: Скрипт не ищет кнопку

14 Dec 2023, 09:23

@marusa122
Только отладка поможет узнать что же именно происходит не так.
Добавь MsgBox, % "Window found" после if !ErrorLevel. Будешь точно знать работает ли обнаружение окна.

ЗЫ. Sleep, 5000 в строке 15 зачем? WinWait и так ждёт 5 секунд. После чего начинается новый цикл, и она снова ждёт 5 секунд. И т.д.
Закомментируй пока что ControlGet. Добавь перед ним команду WinGet, OutputVar, ControlList.
После if (OutputVar) закомментируй Continue, и добавь над или под ним MsgBox, % OutputVar.
Если вывалится список - скрин сюда.
И будем кумекать дальше :)
Please post your script code inside [code] ... [/code] block. Thank you.
marusa122
Posts: 135
Joined: 22 Mar 2023, 07:48

Re: Скрипт не ищет кнопку

14 Dec 2023, 11:01

@vmech, сделала - теперь с небольшими задержками постоянно вываливается MsgBox "Готово", даже если нужное окно не открыто...
vmech
Posts: 356
Joined: 25 Aug 2019, 13:03

Re: Скрипт не ищет кнопку

14 Dec 2023, 11:17

marusa122 wrote:
14 Dec 2023, 11:01
@vmech, сделала - теперь с небольшими задержками постоянно вываливается MsgBox "Готово", даже если нужное окно не открыто...
Так быть не должно. Код такой ?

Code: Select all

Loop
{
    WinWait, % "Диалоговая форма ahk_class WindowsForms10.Window.8.app.0.329445b_r8_ad1",, 5 
    if !ErrorLevel                      ; 1 если таймаут, иначе 0
    {
        WinGet, OutputVar, ControlList
        ; ControlGet, OutputVar, Visible,, WindowsForms10.Window.8.app.0.329445b_r8_ad184
        if (OutputVar)
        {
            MsgBox, % OutputVar
            ; Continue
        }
        else                    ; если кнопки в данном окне не обнаружено
        {
            Sleep, 1000          ; ждем 1 секунду
            MsgBox, % "Готово"   ; и показываем MsgBox
        }
    }
    ; Sleep, 5000 ; если окно не найдено, начинаем проверку сначала
}
Диалоговая форма, а не Диалоговое окно... :oops:
Last edited by vmech on 16 Dec 2023, 16:14, edited 1 time in total.
Please post your script code inside [code] ... [/code] block. Thank you.
marusa122
Posts: 135
Joined: 22 Mar 2023, 07:48

Re: Скрипт не ищет кнопку

14 Dec 2023, 13:52

@vmech, эта версия кода вообще не выдает никаких Msgbox...
vmech
Posts: 356
Joined: 25 Aug 2019, 13:03

Re: Скрипт не ищет кнопку

14 Dec 2023, 14:06

marusa122 wrote:
14 Dec 2023, 13:52
@vmech, эта версия кода вообще не выдает никаких Msgbox...
Блин. Тогда я не знаю что ещё можно сделать. У меня нет ни одного модерн-приложения. И в моей винде их подсистема вообще вырезана с корнями... :(

ЗЫ. С обычными Win32 приложениями мой код работает, и исправно выводит портянки со списками элементов в их GUI.

ЗЫЫ. Минуточку! Но WindowSpy же нормально увидел и второе окно, и кнопку в нём! Пока что я пребываю в некотором смятении...
Please post your script code inside [code] ... [/code] block. Thank you.
vmech
Posts: 356
Joined: 25 Aug 2019, 13:03

Re: Скрипт не ищет кнопку

15 Dec 2023, 05:30

marusa122 wrote:
14 Dec 2023, 13:52
@vmech, эта версия кода вообще не выдает никаких Msgbox...
Тебе необходима нормальная среда разработки, в которой есть отладчик, и пошаговое исполнение скриптов, с отображением значений всех переменных, многоцелевыми точками останова, стеком вызовов. Без этого очень сложно делать что то весомое - это занимает неадекватно много времени, и отнимает кучу сил.
Проще говоря - нужно не «гадать на кофейной гуще», а учиться разрабатывать код. Иначе это не разработка, а чёрте что...
Please post your script code inside [code] ... [/code] block. Thank you.
teadrinker
Posts: 4333
Joined: 29 Mar 2015, 09:41
Contact:

Re: Скрипт не ищет кнопку

16 Dec 2023, 14:29

На скриншоте:
Image
В коде: WinWait, % "Диалоговое окно ahk_class WindowsForms10.Window.8.app.0.329445b_r8_ad1",, 5
vmech
Posts: 356
Joined: 25 Aug 2019, 13:03

Re: Скрипт не ищет кнопку

16 Dec 2023, 16:11

@teadrinker
Спасибо. Ошибки случаются.

@marusa122
Исправь у себя, пожалуйста, если ты тоже «прохлопала» эту ошибку.
Please post your script code inside [code] ... [/code] block. Thank you.
marusa122
Posts: 135
Joined: 22 Mar 2023, 07:48

Re: Скрипт не ищет кнопку

23 Dec 2023, 04:57

@vmech, спасибо, теперь скрипт работает.
Но возникла другая проблема. Хотела добавить после отсчета времени еще одну проверку.
Если после отсчета 5 секунд окно с таким названием существует - снова проверить наличие той же кнопки. Если кнопка есть - продолжать выполнение цикла. Если нету - показать MsgBox.
Если после отсчета 5 секунд окно НЕ существует - продолжать выполнение цикла.
Пробовала добавить такую проверку - скрипт вообще перестал работать. MsgBox появляется не когда нужно, а когда ему вздумается. Что я сделала не так?

Code: Select all

#SingleInstance, force
#NoEnv

SetWorkingDir %A_ScriptDir%

ProgramName := "Program1"

Loop
{
    WinWait, % "Диалоговая форма ahk_class WindowsForms10.Window.8.app.0.329445b_r8_ad1",, 
    if !ErrorLevel                    																	  ; 1 если таймаут, иначе 0
    {
        ControlGet, OutputVar, Visible,, WindowsForms10.Window.8.app.0.329445b_r8_ad184
        if (OutputVar)
            Continue
        else                  											  ; если кнопки в данном окне не обнаружено
        {
            Sleep, 5000  				; ждем 5 секунд
            if WinExist("Диалоговая форма ahk_class WindowsForms10.Window.8.app.0.329445b_r8_ad1") 		; если окно после 5 секунд все еще существует
            {
            ControlGet, OutputVar, Visible,, WindowsForms10.Window.8.app.0.329445b_r8_ad184		; проверяем наличие кнопки в нем еще раз
      		if (OutputVar) 
           		 Continue 
           	Else				 ; если кнопки в данном окне снова не обнаружено
                	MsgBox, 262160, % "Program1", % "Готово"	; показываем MsgBox
      	    }
      	    else 			; если окно после 5 секунд закрыто
      	    	Continue		; начинаем проверку сначала
    }
    Sleep, 1000 						; если окно не найдено, начинаем проверку сначала
}
vmech
Posts: 356
Joined: 25 Aug 2019, 13:03

Re: Скрипт не ищет кнопку

23 Dec 2023, 08:03

@marusa122
  • В строке 10: или потеряла значение таймаута, или убери ненужные запятые на конце выражения.
  • Между 29 и 30 строками: потеряла фигурную скобку перед Sleep, 1000.
ЗЫ.
Please post your script code inside [code] ... [/code] block. Thank you.

Return to “Помощь”

Who is online

Users browsing this forum: No registered users and 127 guests