2

我正在开发 AutoHotKey 中的一个程序,该程序可以自动将 .FTM (FamiTracker) 文件大量转换为 .WAV 的过程。问题是我希望它在每个循环中增加“send {down}”语句的值+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

我被困了很长时间,有什么想法吗?我本质上希望光标在程序的每个循环之后移动到下一首歌曲。程序第一次运行时,它会加载歌曲 1,然后一旦歌曲 1 完成,它将重复该过程,但继续单击歌曲 2,依此类推。

非常感谢

4

2 回答 2

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

您的原始代码将一直运行到文件列表的末尾,然后一遍又一遍地对最后一个文件执行相同的操作。因此,我在代码中添加了文件名比较。在文件打开时,您可能有文本形式的文件名,这是您复制到剪贴板并将剪贴板与以前的文件名进行比较的内容。通过添加起始​​编号,您可以在某个文件处重新开始。

我看到您的代码使用了很多鼠标点击。如果你只运行一次,这没有问题,但如果你想可靠地运行它,还有其他方法。

整体检查:检查在此过程中打开的每个窗口,并验证正确的窗口是否打开。在此示例中,我检查标题为“文件打开”的窗口是否确实已打开并处于活动状态(其他进程或程序 [聊天、更新等] 可以接管焦点,您的脚本将执行其中的代码其他程序...)。

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

祝你好运!

于 2013-02-21T06:14:01.543 回答
1

尝试使用,Window Spy这样您将获得某个窗口的控件的类名。如果该窗口上有进度条,则更容易收听进程完成的事件。

基本上,使用ControlGet命令来获取转换的进度并使用ControlSend命令在控件上发送事件(例如ControlSend, Button1, {Click}, ahk_class AWindow)。

于 2013-02-21T04:02:57.133 回答