Windows 10 如何正确防止自动热键脚本的多个实例同时运行?

Windows 10 如何正确防止自动热键脚本的多个实例同时运行?,windows-10,autohotkey,Windows 10,Autohotkey,我在阅读手册、在过去几周无休止地搜索和排除故障后,制作了这个自动热键脚本: #Persistent #SingleInstance force if A_Args[1] > 0 { Menu, Tray, Icon, C:\blablabla\new notifications.png } else { Menu, Tray, Icon, C:\blablabla\no new notifications.png } 这个,我已经编译成test.exe。然后我从一个终端

我在阅读手册、在过去几周无休止地搜索和排除故障后,制作了这个自动热键脚本:

#Persistent
#SingleInstance force

if A_Args[1] > 0
{
    Menu, Tray, Icon, C:\blablabla\new notifications.png
}
else
{
    Menu, Tray, Icon, C:\blablabla\no new notifications.png
}
这个,我已经编译成
test.exe
。然后我从一个终端这样调用它:
test.exe 1
test.exe 0
test.exe 2
test.exe 3
,等等

如果我慢慢地/手动地执行,它就会工作:它只保留脚本的一个实例,在通知区域中以一个漂亮的小图标显示(如预期的那样),从不启动多个实例

但是,当我开始真正使用它时,通过从脚本中调用相同的终端命令,它通常会打开两个或多个实例,这些实例保持打开状态,只会使通知区域越来越长,而忽略了它只能作为一个实例运行的规则

每次这样的命令调用之后,我都能通过在脚本中引入一个简短的“睡眠”来“解决”它,这样同一个脚本就不会连续调用它太快然而,今天,我意识到我的多个不同脚本经常同时或几乎同时调用它。这意味着我的“聪明的”睡眠解决方案是不够的

然后我想,我可以使用数据库来跟踪脚本上次调用此功能的时间,如果时间太短,请不要这样做,但如果我这样做,整个要点都将丢失,因为我无法再信任图标来准确地告诉我系统中是否有新通知。我经常想知道是否有这样的“竞争条件”,并手动去检查,无论如何,击败了这一点的视觉指示,这是应该让我总是知道“一目了然”是否有新的通知在我的系统中

也许我可以在我的脚本中设置一个循环,如果它检测到最近发送了通知,我可以反复重试,但这意味着我的脚本可能会暂停很长时间,因为它们都发送通知(特别是在早上,当我醒来并启动系统时)。这似乎是一个错误的解决方案

真的没有办法在脚本本身中正确处理这个问题吗?从我的描述中可以明显看出,
#Persistent
#SingleInstance force
规则没有得到遵守


(我过去也遇到过类似的问题,程序无法“处理”运行命令太快,除了引入睡眠,我永远不知道该怎么办。但即便如此,它也经常会出现小故障。例如,记事本++要求我先打开一个文档,然后用指定的行号再次打开它,在中间睡眠,否则它不会转到指定的行。)

只是在这里抛出想法
#持久性
#单实例强制
可能会发生冲突(而
#持久性
使其成为单实例)。您是否尝试过
#SingleInstance ignore
,它阻止新实例的启动,而不是强制替换旧实例。@ippi好吧,我尝试过您的建议,但是使用
#SingleInstance ignore
,它永远不会替换旧图标,因此,它只在第一次运行,所有后续调用都无效。也许我在这里遗漏了一些内容,但您是否尝试在脚本中运行等待调用test.exe?@RobertMiller您没有遗漏任何内容,但我显然遗漏了。“RunWait”显然是一个AHK命令,但你的确切意思是我应该用它做什么?如果你的主AHK脚本中有一行:test.exe n,你可以用RunWait test.exe n替换它。然后,脚本将停止,直到执行test.exe。这对您来说可能是可接受的,也可能是不可接受的,但它应该可以防止test.exe的多个副本。