使AutoIT等待直到Audacity完成命令

时间:2018-08-28 19:20:57

标签: autoit audacity

我有一个脚本,可以用来自动执行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 :(得分:1)

; 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()返回理想的窗口句柄, 如果使用timeout参数,则0表示窗口不 找到了,因此可以中止自动化。

仅靠主窗口的类名是不够的 Audacity会创建许多具有相同Classname的不可见窗口。 因此,标题可能也需要使用。标题可能是 单独使用,但以文件名命名有时可能不是唯一的。 有关用法,请参见Window Titles and Text Advanced

WinActivate()用于边界窗口,尽管它 可能不需要,因为control*()通常不需要激活 视窗。相比之下,标准Msgboxes可能需要 主动接受发送给他们的消息。

ShellExecuteWait()RunWait()不利于自动化 因为它们阻止脚本继续执行直到执行 过程已完成。 因此,请改用ShellExecute()Run()。 重复使用RunWait("Audacity")似乎是 绝望地纠正行为,尽管有缺陷。 等待窗口出现是如何控制流量,然后 ControlCommand()之类的功能可以检测控件的状态。

在按钮上使用

ControlClick()。 尽管脚本使用了类名Button2的CtrlID 始终适用于英语用户,那么您可以使用 OK 按钮将为OK

ProcessWaitClose($iPid)是可选的。 有时等待程序很有用 在脚本退出之前自动退出。

您在代码中注释了“ 让对话框消失” 启动Auda​​city之后。您可以在 对话框或首选项->界面选项。忠告 禁用,因为继续处理是将来的问题。 我添加了一些代码以禁用 audacity.cfg个文件。如果不是首选禁用 _SplashScreen(True)或随后手动完成 AdLibRegister('_WelcomeWindow')呼叫将处理 关闭窗户。请注意,“欢迎”窗口不会 不是关闭而是隐藏。

_SplashScreen(True)将启动设置更改为0以禁用启动。

_SplashScreen(False)_SplashScreen()不会更改设置。 如果启用了启动,则呼叫返回1,否则返回0