我正在使用AutoHotKey中的一个程序来自动化将.FTM(FamiTracker)文件转换为.WAV的过程。问题是我希望它增加每个循环的“发送{向下}”语句+1的值(以选择文件夹中的下一首歌曲)。
编辑我已经更新了代码。增量语句有效,我只需要找到一种方法使整个程序循环多次,以转换文件夹中的所有文件(添加+1以发送{down}每个循环)。 现在的问题是它没有循环整个程序。任何帮助都表示赞赏!
以下是该程序在启动FamiTracker音乐应用程序后的外观摘录:
Sleep, 800 ; I want the program to loop back to here when it reaches the last line
click 20,30 ; clicks "file"
Sleep, 500
Send {down 2} ; clicks "open"
send {enter}
Sleep, 1200
click 211,128 ; clicks first filename in folder
Sleep, 1200
send {enter}
Sleep, 1000
click 20,30 ; clicks "file"
send {down 6}
send {enter} ; clicks "create wav"
Sleep, 1000
click 157,57 ; increase playcount to 2
Sleep, 500
send {enter}
Sleep, 1000
send {enter}
Sleep, 2500
send {enter}
click 20,30 ; clicks "file"
Sleep, 500
Send {down 2} ; clicks "open"
send {enter}
Sleep, 1200
click 211,128 ; clicks first filename in folder
Sleep, 1000
Jmp:=1
Loop
{
Send, {Down %Jmp%}
Jmp+=1
return
}
sleep, 100
send {enter}
Sleep, 1000
click 20,30 ; clicks "file"
send {down 6}
send {enter} ; clicks "create wav"
Sleep, 1000
click 157,57 ; increase playcount to 2
Sleep, 500
send {enter}
Sleep, 1000
send {enter}
Sleep, 2500
send {enter}
Sleep, 1000 ; final line of code, want it to loop back to line 1 to repeat process till all files in folder are converted
我被困了一段时间,有什么想法吗?我基本上希望光标在程序的每个循环之后移动到下一首歌曲。程序第一次运行时,它会加载song1,然后一旦song1完成,它将重复该过程,但继续并单击song2,依此类推。
非常感谢
答案 0 :(得分:1)
尝试使用Window Spy
,这样您就可以获得某个窗口控件的类名。如果该窗口上有进度条,则更容易听到该过程完成的事件。
基本上,使用ControlGet
命令获取转换进度并使用ControlSend
命令在控件上发送事件(例如ControlSend, Button1, {Click}, ahk_class AWindow
)。
答案 1 :(得分:1)
Jmp:=1
Loop
{
Send, {Down %Jmp%}
Jmp+=1
}
Return
我已更新您的代码以显示如何使用循环。花括号定义将在循环内执行的内容。
InputBox, Jmp , Start, Enter Start number,,,,,,,,1
Loop
{
Sleep, 800
click 20,30 ; clicks "file"
Sleep, 500
Send {down 2} ; clicks "open"
; Copy the file name somewhere here
; Send, ^c ; Copy highlighted text to ClipBoard
; ClipWait
; If (ClipBoard = PreviousName)
; {
; Break
; MsgBox, Next filenumber = %Jmp%
; }
; PreviousName = %ClipBoard%
send {enter}
Sleep, 1200
click 211,128 ; clicks first filename in folder
Sleep, 1200
send {enter}
Sleep, 1000
click 20,30 ; clicks "file"
send {down 6}
send {enter} ; clicks "create wav"
Sleep, 1000
click 157,57 ; increase playcount to 2
Sleep, 500
send {enter}
Sleep, 1000
send {enter}
Sleep, 2500
send {enter}
click 20,30 ; clicks "file"
Sleep, 500
Send {down 2} ; clicks "open"
send {enter}
Sleep, 1200
click 211,128 ; clicks first filename in folder
Sleep, 1000
Send, {Down %Jmp%}
Jmp+=1
sleep, 100
send {enter}
Sleep, 1000
click 20,30 ; clicks "file"
send {down 6}
send {enter} ; clicks "create wav"
Sleep, 1000
click 157,57 ; increase playcount to 2
Sleep, 500
send {enter}
Sleep, 1000
send {enter}
Sleep, 2500
send {enter}
Sleep, 1000
; If (Jmp > "1000")
; Break
}
Return
您的原始代码将一直运行到文件列表的末尾,然后一遍又一遍地继续对最后一个文件执行相同的操作。因此我在代码中添加了文件名比较。在文件打开时,您可能以文本形式提供文件名,这是您复制到ClipBoard并将ClipBoard与先前文件名进行比较的内容。通过添加起始编号,您可以在某个文件中重新启动。
我看到你的代码使用了很多鼠标点击。如果你只运行一次,这没有问题,但是如果你想要可靠地运行它,还有其他方法。
整体检查: 检查在此过程中打开的每个窗口,并验证右侧窗口是否已打开。在这个例子中,我检查标题为“文件打开”的窗口是否确实打开并处于活动状态(其他进程或程序[聊天,更新等]可以接管焦点,并且您的脚本将执行此处的代码其他计划......)。
SetTitleMatchMode = 2
WinWaitActive, File Open, , 5 ; Wait up to five seconds for the screen
if ErrorLevel ; Execute this when the window is not activated within 5 seconds
{
SoundBeep 1000 , 1000 ; Warn the user
Break
}
尽可能尝试使用键盘快捷键,或者(更高级)使用AutoHotKey Windows Spy
并检查ClassNN:在“现在在鼠标光标下”部分,然后使用它来直接激活这些按钮而不是通过鼠标坐标。