自动热键变量未在按键时更新
Posted
技术标签:
【中文标题】自动热键变量未在按键时更新【英文标题】:autohotkey variables not updating on keypresses 【发布时间】:2021-09-28 21:36:59 【问题描述】:我有许多热键,它们会经历各种进程并休眠一段时间以显示动画。我想设置一个变量,一次只允许 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 仍处于睡眠状态时发出哔哔声阶段。所以也许上面的代码一开始也有缺陷。各个键似乎尊重自己,直到第一个实例完成后才重新初始化......所以如果我只是捣碎一个键,蜂鸣声就会起作用。我也不想在加载脚本后按回车键来让代码工作。
这里有一个简单的作弊方法吗?就像在 lua 中,未声明的变量会自动为假......所以我可以换成 if (work=false)....,但我无法使用 autohotkey 找到任何这样的行为。
【问题讨论】:
【参考方案1】:根据要求,这是一个不同的解决方案,它使用可变逻辑来允许或阻止执行热键命令:
#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 以便可以运行另一个命令
结束热键
【讨论】:
我习惯了只运行一次或在游戏循环中运行(每秒 30 次)的脚本。这个是如何运行的?我只是对工作感到好奇:=真正的部分......那只运行一次......?我认为它就像一个游戏循环,它会不断更新自己,使其等于真......覆盖任何其他赋值,如假。但是这一行的工作方式就好像它是一个只运行一次的初始定义变量。是这样吗?脚本只是每秒检查 if 和 hotkeys:: 100 次左右? 这在我身上——我应该在我写答案时解释代码是如何工作的。我已经更新了帖子以包含这个@kite,所以如果您有任何问题,请查看并 lmk。 实际上这段代码并不总是有效。它适用于记事本。但它在游戏等应用程序中不起作用。想法?我不得不使用 maxthreads 方法。 要让它适用于其他东西,只需从顶部删除#IfWinActive ahk_class Notepad
是的,我注意到了,它已被相应地删除/更新。还是行不通。脚本的其余部分......正如我所拥有的那样,它正在游戏中工作,是的,它都在#IFWINACTIVE 部分中......所以它不是那个【参考方案2】:
一种简单的方法是在脚本顶部声明#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
【讨论】:
是的,这似乎确实达到了预期的行为。仍然想知道如何使用变量来做到这一点。 当然——我会用可变门解决它的另一个答案以上是关于自动热键变量未在按键时更新的主要内容,如果未能解决你的问题,请参考以下文章
安卓按键精灵脚本。求大神制作一个安卓按键精灵点击屏幕的脚本。就是触摸一个位置后自动重复点击屏幕那个