我想要实现的是使用SetTimer命令启动无限子程序。下面的代码并不起作用,但我应该很清楚我要做的事情。 无论如何,每次按F1我想要开始一个新的子程序,使用不同的名称
guiCount := 0
f1::
guiCount++
drawFrameAroundWin(WinExist("a"), "Red", 5, 1)
WinGetActiveTitle, activeWinTitleFrame
wingetpos,activeWinTitleFrameX,,,,%activeWinTitleFrame%
SetTimer, Window%guiCount%
return
Window%guiCount%:
wingetpos,activeWinTitleFrameX2,,,,%activeWinTitleFrame%
if (activeWinTitleFrameX != activeWinTitleFrameX2)
{
Gui,Destroy
SetTimer, window%guiCount%, off
}
return
答案 0 :(得分:1)
如您所知,子程序无法在您尝试时使用变量声明。你似乎试图使用Threads,不幸的是官方AutoHotkey缺少它们,但有3个选项:AutoHotkey.dll提供类似线程的功能(google it),你可以修改并保存一个新脚本,并在每次你想要的时候单独运行它创建一个新的窗口边框,或者你可以使用一个带有计时器的设置时间(如果它不必在精确的事情中销毁gui)并按照从第一个创建到最后的顺序销毁窗口。
下面演示了第3个选项,而不是完美的实现:
guiNumArr := []
F1::
WinGetActiveStats, Title, Width, Height, X, Y
guiCurrent := drawFrameAroundWin(Width, Height)
guiNumArr.push(guiCurrent)
Gui, %guiCurrent%:Show, NoActivate ; The Gui will not steal keyboard focus
SetTimer, guiDestroy, 2000
Return
guiDestroy:
if (guiNumArr.length()) {
x := guiNumArr.RemoveAt(1)
gui, %x%:destroy
return
}
else
SetTimer, guiDestroy, Off
return
drawFrameAroundWin(TW:=320, TH:=240, BorderThickness:=3, BorderColor:="0000FF") {
static guiNumber := 0
guiNumber++
colors := ["Red", "Yellow", "Blue", "Green"]
random, x, 1, 4
BorderColor := colors[x]
Gui, %guiNumber%:Margin, %BorderThickness%, %BorderThickness%
Gui, %guiNumber%:Color, %BorderColor%
Gui, %guiNumber%:Add, Text, w%TW% h%TH% 0x6 ; Draw a white static control
Gui, %guiNumber%:+LastFound
WinSet, TransColor, FFFFFF
Gui, %guiNumber%: -Caption +AlwaysOnTop +ToolWindow
Return guiNumber
}