自动热键变量未在按键时更新

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

【讨论】:

是的,这似乎确实达到了预期的行为。仍然想知道如何使用变量来做到这一点。 当然——我会用可变门解决它的另一个答案

以上是关于自动热键变量未在按键时更新的主要内容,如果未能解决你的问题,请参考以下文章

安卓按键精灵脚本。求大神制作一个安卓按键精灵点击屏幕的脚本。就是触摸一个位置后自动重复点击屏幕那个

postgres 自动增量未在显式 id 插入时更新

Flutter Firebase:Firebase 中的数据更新,但未在屏幕上自动显示计数器更新

为啥 __weak 变量未在自动释放池中注册?

从热键中删除自动修饰符

如何使用自动热键编辑注册表值?