autohotkey:停止/结束包含多个块的当前热键线程
Posted
技术标签:
【中文标题】autohotkey:停止/结束包含多个块的当前热键线程【英文标题】:authotkey: stopping/ending current hotkey thread containing multiple blocks 【发布时间】:2021-10-01 21:46:58 【问题描述】:3::
;code with sleep timers here
loop 5
;code with sleep timers here
;code with sleep timers here
我有一个类似上面的热键设置。我希望能够在它运行时停止它,理想情况下使用任何 wasd 按键,不太理想的是再次按下相同的键 (3)。我读过的所有文档都依赖于使用 BREAK ......这只会打破直接循环。在第二个循环中折腾整个代码并中断不起作用:
#MaxThreadsPerHotkey 2
3::
Toggle := !Toggle
loop, 1
;code
loop 5
If not Toggle
break
;code
If not Toggle
break
return
我尝试暂停而不是中断,但我不希望保存当前线程,我希望它重置。我尝试了 SUSPEND,但它只会停止未来的热键......它会完成当前正在运行的热键。我用#persistent 尝试了EXIT,但它也没有按预期工作。同样,我想要的是正在运行的当前热键停止并重置,就好像它正常结束一样......而不影响我的其他热键。
【问题讨论】:
【参考方案1】:在 AHK 中没有一个很好的方法(我知道)(至少没有一些非常深奥的魔法) 但它是微不足道的在AHK_H。
什么是 AHK_H?
AutoHotkey_H 为原始 AutoHotkey 添加了功能,并使用 NewThread() 函数(仅限 v2)和 AutoHotkey.dll 提供真正的多线程。
现在我不会推荐或反对您学习/使用 AHK_H,我只是将其作为一个选项来介绍。 另外我要写 AHK-v2,因为我真的看不出写 AHK_H-v1 有什么意义,而且与 H-v2 相比,H-v1 也缺少一些功能。
因此,在 AHK_H(v2) 中,您可以执行以下操作:
script1 := "
(
ToolTip("Hi from Thread1, step1")
Sleep(1000)
Loop 5
ToolTip("Hi from Thread1, loop" A_Index)
Sleep(1500)
ToolTip("Hi from Thread1, step2")
Sleep(5000)
ToolTip("Bye from Thread1, the end")
Sleep(1000)
)"
script2 := "
(
ToolTip("Hi from Thread2, step1")
Sleep(2000)
Loop 5
ToolTip("Hi from Thread2, loop" A_Index)
Sleep(1750)
ToolTip("Hi from Thread2, step2")
Sleep(3000)
ToolTip("Bye from Thread2, the end")
Sleep(1000)
)"
1::
global script1, Thread1
if (IsSet(Thread1))
Thread1.ahkterminate()
Thread1 := AhkThread(script1)
^1::
global Thread1
if (IsSet(Thread1))
Thread1.ahkterminate()
2::
global script2, Thread2
if (IsSet(Thread2))
Thread2.ahkterminate()
Thread2 := AhkThread(script2)
^2::
global Thread2
if (IsSet(Thread2))
Thread2.ahkterminate()
首先,我们为变量 script1
和 script2
定义两个单独的 AHK 脚本,就像纯文本字符串一样。
为此使用了续行部分(docs)。
然后定义热键1::
。
在这里,我们首先说我们正在使用该热键范围之外的变量 script1
和 Thread1
(docs1)(docs2),就像您需要的那样在 AHK-v1 中做函数。在 v2 中,您也需要为热键执行此操作。
然后我们检查变量Thread1
是否已经被设置(docs),我们想在再次使用ahkThread
(docs)运行它之前终止它(除非您希望能够同时运行多个相同的脚本)。
然后定义热键^1::
。
在这里,我们可以随时通过按 Ctrl+1 来终止 thread1。
然后对 2 号进行完全相同的操作。
当然,这是一个非常简单的示例,其中不需要线程之间的通信或任何更特殊的通信。当然,所有这些也是非常可行的。
要运行您的 AHK_H-v2 脚本,请下载 AHK_H-v2 here,然后通过文件夹 x64w
中的 AHK 解释器运行您的 .ahk
文件。
(如何?例如,只需将您的.ahk
文件拖放到AutoHotkey.exe
上)
要阅读 AHK_H 文档,我推荐下载随附的 .chm
文件。
它往往比在线文档更好/更新。
为了学习 AHK-v2 本身,这里有一个帮助您入门的文档页面:https://lexikos.github.io/v2/docs/v2-changes.htm AHK-v2 刚刚从 alpha 阶段出来,现在处于 beta 阶段。
【讨论】:
【参考方案2】:您可以使用不同的热键并重新加载脚本。
your_hotkey::
reload
如果您当前的代码是这样工作的,或者直接使用reload
而不是break
。
【讨论】:
以上是关于autohotkey:停止/结束包含多个块的当前热键线程的主要内容,如果未能解决你的问题,请参考以下文章
Autohotkey 和 Windows 10:如何获取当前资源管理器路径