使用SetTimer命令的Lauch无限子程序

时间:2016-08-20 09:47:12

标签: autohotkey

我想要实现的是使用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

1 个答案:

答案 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
}