AutoHotKey循环递增

时间:2013-02-21 01:15:27

标签: loops converter autohotkey

我正在使用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,依此类推。

非常感谢

2 个答案:

答案 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:在“现在在鼠标光标下”部分,然后使用它来直接激活这些按钮而不是通过鼠标坐标。

祝你好运!