微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

autohotkey 变量不会在按键时更新

如何解决autohotkey 变量不会在按键时更新

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

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' 也不应该能够再次激活......至少直到它的睡眠结束并且 work=true 再次激活。

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

这里有简单的作弊吗?就像在 lua 中,未声明的变量自动是假的...所以我可以切换到 if (work=false){....,不过我用 autohotkey 找不到任何这样的行为。

解决方法

一种简单的方法是在脚本顶部声明 #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 总结的那样

当 AutoHotkey 脚本启动时,它只是从 脚本的第一行。它从那里一行一行地继续,直到 它到达终点。这称为自动执行部分。

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

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

  • 当热键被触发时
  • 如果 work 为真
    • work 设置为 false
    • 哔哔声等
    • 稍等片刻
    • 然后将 work 设置回 true 以便可以运行另一个命令
  • 结束热键

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。