AutoHotKey - 重复 if 语句在循环中一直将其条件视为 true

AutoHotKey - repeating if statement keeps treating its condition as true in a loop

我正在尝试使用 AutoHotKey 为具有钓鱼系统的游戏创建自动点击器。该系统会在您的头顶上方出现一个黑色感叹号图标,周围环绕着一个大的白色方形边框,此时您必须左键单击才能抓到鱼。由于图标出现的时间每次都 运行 完全不同,我必须能够动态确定垃圾点击的时间。

我已经尝试使用 PixelGetColor(如下所示)找到一个特定的像素,每当出现感叹号时它就会变成白色,但它从未检测到感叹号,更令人担忧的是,无论何时它检测到我屏幕上的特定像素为白色,PixelGetColor 之后的 if 语句条件始终 returns 为真。

Toggle = False

loop 
{
  if (Toggle = "true")
  { 
    Sleep, 100
    PixelGetColor, color, 966, 463
    if (color = 0xFFFFFFFF) {
          MsgBox, It works!
    }
  }
}

F1::
if (Toggle = "true") {
  Toggle = False
}
else {
  Toggle = True
}

F1 绑定到一个布尔值,它确定循环内的代码是否为 运行。 PixelGetColor 的最后两个输入,966 和 463,分别是特定像素的 x 和 y 位置。

一旦我开始在游戏中移动我的相机,我希望获得不同的颜色值,但在它检测到白色后,它继续向关于脚本 'working' 的消息发送垃圾邮件,而它显然没有.

简单来说,这到底是怎么回事?一段时间以来,我一直在努力弄清楚这一点。如果有人可以解释我做错了什么,以及在循环内 应该 完成什么以使程序按预期工作的代码片段,我会永远(嗯,几乎)感激。

当我按原样 运行 您的代码时,我在按 F1 后没有收到消息框。 (我确保指定坐标处的像素是白色的。)将颜色匹配更改为“0xFFFFFF”(每个 RGB 两个字节)使它对我有用并且它按照你在描述中的预期工作。

但是,我很惊讶它的工作原理,因为 true/false 被存储为变量 Toggle 中的字符串,我完全预计 "True" 不会匹配 "true" 因为的情况差异。 (经过更多挖掘,我发现表达式中的 = 不区分大小写;== 区分大小写 - 我想我今天学到了一些东西。)

除了颜色,我在代码中没有看到任何会阻止它工作的东西。下面是您的修改版本,将 true/false 视为布尔值并略有简化。希望它也对你有用。

Loop 
{
    If Toggle
    { 
        Sleep , 100
        PixelGetColor , color , 966 , 463
        If ( color = 0xFFFFFF )
            MsgBox ,,, It works! , 0.5
}   }

f1::Toggle := !Toggle


编辑: 添加区域和方差以根据下面的评论进行搜索。
用下面的两行替换 PixelGetColorIf 语句行。

        PixelSearch ,,, 900 , 400 , 1000 , 500 , 0xFFFFFF , 20 , FastRGB
        If !ErrorLevel

这将在 100x100 像素的区域中搜索具有 20 种色差的纯白色。您可能需要调整矩形大小和位置以及方差以使其适合您。更多信息 here.