AHK在这里做什么?我做错了什么?

What is AHK Doing Here? And What did I get Wrong?

我正在尝试制作一个脚本,定期读取不同坐标处的像素,并将它们与基于给定文件的给定十六进制颜色进行比较 out.txt。格式为 x-cord y-cord color.

Loop
{
    if (GetKeyState("Space"))
    {
        Loop, Read, out.txt
        {
            tgt := StrSplit(%A_LoopReadLine%,%A_Space%)
            PixelGetColor hue, tgt[0], tgt[1]
            if (%hue% != tgt[2])
            {
                Click tgt[0], tgt[1]
            }
        }
    }
        Sleep 10
}

产生这个错误,截屏是因为你不能select文本:

它说变量名包含一个非法字符,后跟文件中应该是一行的内容,我试图将该值分配给一个数组,所以我不确定我做错了什么.我复习了所有看起来相关的部分的 ahk 语法,但没有发现任何问题。看起来只是设置一个变量。我在这里找不到错误。

您基本上只是对已弃用的旧语法和现代表达式语法感到困惑。
通过将变量包装在 % 中来引用变量是您在旧版 AHK 中所做的。
但是,这是遗留问题,基本上不应该再这样做了。
在表达式中,您只需键入变量名称即可引用变量。

如果您使用的是遗留语句(基本上只是命令中的参数),您可以通过从参数开始使用单个 % 后跟 space 来切换到表达式语法。您将在下面看到这方面的示例。

我将逐行修复您的代码并记录更改:

这里我强制 AHK 解释文件名参数上的表达式,只是为了显式指定带有 "" 的字符串。
这不是必需的,在实践中也没有什么区别,但如果你问我,它看起来好多了。特别是如果我们要有一个更长更复杂的字符串。将消除例如需要转义某些字符等
Loop, Read, % "out.txt"

这里我删除了 %s,因为我们在 function's 参数中。
函数不是遗留的 AHK,它们使用现代表达式语法,所以我们通过简单地输入变量的名称来引用变量。
tgt := StrSplit(A_LoopReadLine, A_Space)

现在我们再次使用命令。默认情况下,所有命令对每个参数都使用旧语法(除非文档中另有说明)。
PixelGetColor 实际上恰好是那些接受 x 和 y 参数表达式的命令之一,所以我实际上不需要通过以 % 开始的参数来强制表达式。
但这并没有什么坏处,所以我这样做只是为了让它更清楚,并让它显示您通常使用命令执行的操作。
PixelGetColor, hue, % tgt[0], % tgt[1]

non-legacy if 不使用旧语法,因此 %% 被删除。
if (hue != tgt[2])

Click 命令不接受表达式,所以我们必须用 % 强制它。
Click, % tgt[0] ", " tgt[1]
现在如果你有关注上面的内容,你应该想知道为什么我没有这样做:
Click, % tgt[0], % tgt[1]
这将是一个很好的问题。如果它实际上是除 Click 命令以外的任何其他命令,您就会完全这样做。
您不使用 Click 命令执行此操作的原因是因为它很特殊(无论好坏)。它实际上没有不同的参数,它只有一个字符串参数。该参数包含所有必需的单词、逗号和数字。
tgt[0] ", " tgt[1] 创建的是一个字符串参数。它将这两个值与字符串逗号和 space.

连接起来

完整脚本如下:

Loop
{
    if (GetKeyState("Space"))
    {
        Loop, Read, % "out.txt"
        {
            tgt := StrSplit(A_LoopReadLine, A_Space)
            PixelGetColor, hue, % tgt[0], % tgt[1]
            if (hue != tgt[2])
            {
                Click, % tgt[0] ", " tgt[1]
            }
        }
    }
    Sleep, 10
}

要了解有关遗留与表达式的更多信息,这里有一个非常好的文档页面可以帮助您入门:
https://www.autohotkey.com/docs/Language.htm