Заставить AutoIT ждать, пока Audacity не выполнит команду - PullRequest
0 голосов
/ 28 августа 2018

У меня есть скрипт, который я хотел бы использовать для автоматизации процессов в Audacity. Я настроил его так, чтобы все функции, которые я хочу выполнять в Audacity, были сочетаниями клавиш (поскольку я не думаю, что Audacity использует стандартные оконные меню, как это требуется для WinMenuSelectItem()) Другими словами, весь мой код состоит из нескольких экземпляров. команды Send(). Проблема в том, что AutoIT выполняет код слишком быстро. Я пытался использовать WinWait(), но процессы занимают различное количество времени. Я также пробовал ShellExecuteWait() и RunWait() Есть ли способ заставить его ждать, пока программа ничего не делает, и затем выполнять мои команды отправки? Вот часть моего кода

Run("C:\Program Files (x86)\Audacity\audacity.exe")
; wait until it's active
WinWaitActive("Audacity")

; get the dialogue box to go away
Send("{ENTER}")
RunWait("Audacity")

; open files
Send("^o")
RunWait("Audacity")

; open the certain file & press enter
Send("test.wav")
RunWait("Audacity")
Send("{ENTER}")
RunWait("Audacity")

; select left boundary of silence period
Send("[")
RunWait("Audacity")
Send("000000100{ENTER}")
RunWait("Audacity")

; select right boundary of silence period
Send("]")
RunWait("Audacity")
Send("200000000{ENTER}")
RunWait("Audacity")

1 Ответ

0 голосов
/ 29 августа 2018
; Use for debugging issues. Systray icon show current line.
Opt('TrayIconDebug', 1)

; Delay default: 250s
Opt('WinWaitDelay', 400)

; Delay default: 5s
Opt('SendKeyDelay', 100)

; Path of the wav file.
$sInFile = @WorkingDir & '\test.wav'

; Optional permanent change of splash screen setting.
_SplashScreen(True)

; Run Audacity and argument of the wav file.
$iPid = Run('"C:\Program Files (x86)\Audacity\audacity.exe" "' & $sInFile & '"')

; Check if Run Audacity failed.
If @error Then
    MsgBox(0x40030, @ScriptName, 'Failed to run Audacity')
    Exit 1
EndIf

; Wait for main window to get handle. Title is the filename with no extension.
$hMainWindow = WinWait('[TITLE:test; CLASS:wxWindowNR]', '', 10)

; Check allowed timeout of window.
If Not $hMainWindow Then
    MsgBox(0x40030, @ScriptName, 'Audacity window not detected.')
    Exit 1
EndIf

; If splash screen setting not 0 then handle the window.
If _SplashScreen() Then
    AdlibRegister('_WelcomeWindow')
    WinWait('Welcome to Audacity', '', 3)
    AdlibUnRegister('_WelcomeWindow')
EndIf

; Send '[' to main window to trigger Left Boundary window.
ControlSend($hMainWindow, '', '', '[')

; Get handle of Left Boundary window.
$hMsgWindow = WinWait('Set Left Selection Boundary', '', 5)

; Check allowed timeout of window.
If Not $hMsgWindow Then
    MsgBox(0x40030, @ScriptName, 'Selection Boundary window not detected.')
    Exit 1
EndIf

; Activate window, set time and click OK.
If WinActivate($hMsgWindow) Then
    ControlSend($hMsgWindow, '', 'wxWindowNR1', '{LEFT 3}1'); 1000
    ControlClick($hMsgWindow, '', 'Button2'); OK
EndIf

; Send ']' to main window to trigger Right Boundary window.
ControlSend($hMainWindow, '', '', ']')

; Get handle of Right Boundary window.
$hMsgWindow = WinWait('Set Right Selection Boundary', '', 5)

; Check allowed timeout of window.
If Not $hMsgWindow Then
    MsgBox(0x40030, @ScriptName, 'Selection Boundary window not detected.')
    Exit 1
EndIf

; Activate window, set time and click OK.
If WinActivate($hMsgWindow) Then
    ; Audacity shows 1000 and focus is on the 1st non zero digit which is 1.
    ControlSend($hMsgWindow, '', 'wxWindowNR1', '2'); 2000
    ControlClick($hMsgWindow, '', 'Button2'); OK
EndIf

; More code to do.
Sleep(1000)

MsgBox(0x40040, @ScriptName, 'End of automation.' & @CRLF & @CRLF & _
     'You can close Audacity to finish.')

; Wait for Audacity process to close.
ProcessWaitClose($iPid)

Exit

Func _WelcomeWindow()
    ; Used by AdlibRegister to handle the Welcome window.

    ; Welcome window hides if closed so need to check if exist and is visible (2).
    If WinExists('Welcome to Audacity') Then
        If BitAND(WinGetState('Welcome to Audacity'), 2) Then
            WinClose('Welcome to Audacity')
        Else
            AdlibUnRegister('_WelcomeWindow')
        EndIf
    EndIf
EndFunc

Func _SplashScreen($bDisable = False)
    ; Write to audacity.cfg to disable splash screen.
    Local $sIniFile = @AppDataDir & '\Audacity\audacity.cfg'

    If IniRead($sIniFile, 'GUI', 'ShowSplashScreen', '1') = '1' Then
        If $bDisable Then
            ; Return 1 if ini file change is success.
            If IniWrite($sIniFile, 'GUI', 'ShowSplashScreen', '0') Then
                Return 1
            EndIf
        Else
            ; Return 1 if check for splash screen is enabled.
            Return 1
        EndIf
    EndIf
EndFunc

Opt() используется для замедления ожидания окон и отправки. Также добавлен Opt('TrayIconDebug', 1) для отладки, если, если скрипт считается хорошим, тогда вы можете удалить это Opt().

ControlSend() используется вместо Send() как ControlSend() целевые окна и элементы управления на основе заголовка, текста и т. д. Задержки Opt() не требуются, хотя были добавлены в продемонстрировать использование, хотя, возможно, Audacity может бороться чтобы сохранить скорость, которую AutoIt может автоматизировать. Если возможно, предложите использовать функции Control*() для автоматизации.

Хранение дескрипторов окна в переменной может помочь сохранить повторный набор заголовков. в коде. WinWait() возвращает дескриптор окна, который является идеальным и если используется параметр тайм-аута, то 0 означает, что окно не найдено, чтобы автоматизация могла быть прервана.

Имя класса главного окна само по себе недостаточно, так как Audacity создает много невидимых окон с одним и тем же именем класса. Таким образом, название может потребоваться также. Название может быть используется один, хотя под названием имя файла может не быть уникальным время от времени. См. Заголовки окон и Расширенный текст для использования.

WinActivate() используется в окнах Границы, хотя это может не понадобиться, так как control*() обычно не нуждаются в активном окна. Стандартные Msgbox для сравнения могут потребовать активно принимать сообщения, отправленные им.

ShellExecuteWait() и RunWait() не годятся для автоматизации поскольку они блокируют сценарий от продолжения до выполнения Процесс завершен. Поэтому используйте ShellExecute() или Run() вместо этого. Повторное использование RunWait("Audacity") выглядит как отчаяние, чтобы исправить поведение, возможно, хотя и с недостатками. Ожидание появления окон - как управлять потоком, а затем такие функции, как ControlCommand() могут определять состояние элементов управления.

ControlClick() используется на кнопках. CtrlID Classname Button2 используется, хотя, если скрипт всегда для английских пользователей, то вы можете использовать текст, который будет OK для кнопки OK .

ProcessWaitClose($iPid) необязательно. Иногда полезно подождать программу автоматизирован для выхода до выхода из скрипта.

Вы комментируете ", чтобы диалоговое окно исчезло " в вашем коде после запуска Audacity. Вы можете изменить настройку на диалоговое окно или Настройки -> Параметры интерфейса . Совет отключение, так как это проблема будущего, чтобы продолжать обработку. Я добавил код, чтобы отключить настройку в audacity.cfg файл. Если не предпочитаете отключать с помощью _SplashScreen(True) или сделано вручную AdLibRegister('_WelcomeWindow') вызов обработает закрывая окно Обратите внимание, что окно приветствия не близко, а скорее прячется.

_SplashScreen(True) изменяет настройку заставки на 0, чтобы отключить заставку.

_SplashScreen(False) или _SplashScreen() не изменяет настройки. Вызов возвращает 1, если включена заставка, иначе 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...