autohotkey 变量不会在按键时更新

autohotkey variables not updating on keypresses

我有许多热键,它们经过各种过程并在特定时间段休眠以允许显示动画。我想设置一个变量,一次只允许激活一个……所以如果我点击第一个,然后点击第二个……第二个在第一个完成之前不会做任何事情。同样,我不想在第一次按下同一个键后立即按下相同的键来双重激活它们中的任何一个。

F4:ExitApp
#IfWinActive ahk_class notepad

a::
if (work:=true){
work:=false
soundbeep
;do something
sleep 1000
work:=true
}
return

b::
if (work:=true){
work:=false
soundbeep
;do something else
sleep 2000
work:=true
}
return

即如果我点击 'a'...'b' 在 'a' 的睡眠结束之前无法激活。 'a' 也不应该能够第二次激活......至少在它的睡眠结束并且再次工作=真之前不能。

这留下了 2 个问题。我需要首先以某种方式指定 'work=true' 的初始值。我不知道如何在传统意义上做到这一点。简单地把它放在代码的顶部是行不通的。第二个问题,把它放在另一个键中......比如 enter:: work:=true return......然后最初按下那个键......这不起作用,因为它允许 b 在 a 时发出哔哔声还处于睡眠阶段。所以也许上面的代码一开始也是有缺陷的。各个键似乎尊重自己,直到第一个实例完成后才重新初始化……所以如果我只按下一个键,蜂鸣声就会起作用。此外,我不想在加载脚本后必须按回车键才能使代码正常工作。

这里有简单的作弊方法吗?就像在 lua 中一样,未声明的变量自动为 false...

一个简单的方法是在脚本顶部声明 #MaxThreads 1

附带说明一下,脚本中似乎还有其他一些语法错误。例如,在比较值时(如在 if 语句中),您仍然使用常规的单个 = 而不是赋值 :=。此外,ahk_class 区分大小写,因此 #IfWinActive ahk_class notepad 应替换为 #IfWinActive ahk_class Notepad


更新代码(Work 变量逻辑已删除,因为不再需要):

#MaxThreads 1

#IfWinActive ahk_class Notepad

a::
soundbeep
;do something
sleep 1000
return

b::
soundbeep
;do something else
sleep 2000
return

根据要求,这里有一个不同的解决方案,它使用可变逻辑来允许或阻止热键命令的执行:

#IfWinActive ahk_class Notepad
work:=true
a::
if(work){
    work:=false
    soundbeep
    ;do something
    sleep 1000
    work:=true
}
return

b::
if(work){
    work:=false
    soundbeep
    ;do something else
    sleep 2000
    work:=true
}
return

更新:工作原理细目

首先,脚本从 auto-execute 部分开始。正如 maul-esel

所总结的那样

When an AutoHotkey script launches, it just starts execution from the first line of your script. It continues from there line by line until it hits an end point. This is called the auto-execute section.

因此,通过在脚本的这一部分包含 work:=true,我们不仅在触发任何热键之前初始化变量的值,而且我们将 work 的范围设置为一个全局变量,可以通过不同的热键访问。

脚本的其余部分更直接一些,其中每个热键本质上是(伪代码):

  • 当热键被触发时
  • 如果work为真
    • work 设置为 false
    • 提示音等
    • 等待一段时间
    • 然后将work设置回true,这样另一个命令就可以运行
  • 结束热键