繁体   English   中英

autohotkey 变量不会在按键时更新

[英]autohotkey variables not updating on keypresses

我有许多热键,它们会经历各种过程并在特定时间段内休眠以显示动画。 我想设置一个变量以允许一次只激活 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 再次激活。

这留下了2个问题。 我需要首先以某种方式指定“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

更新:分解它的工作原理

首先,脚本从自动执行部分开始。 正如 maul-esel 优雅地总结的那样

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

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

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

  • 当热键被触发时
  • 如果work是真的
    • work设置为假
    • 哔哔声等。
    • 等待一段时间
    • 然后将work设置回 true 以便可以运行另一个命令
  • 结束热键

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM