Function 是否将自动热键任务栏菜单项绑定到函数?

Function 是否将自动热键任务栏菜单项绑定到函数?,function,contextmenu,autohotkey,system-tray,subroutine,Function,Contextmenu,Autohotkey,System Tray,Subroutine,AutoHotkey命令允许您自定义脚本通知区域图标的上下文菜单,但它似乎需要将标签/子例程附加到菜单项 我有一些函数,虽然我可以转换成子例程,但我不想转换,因为它们更容易使用,更清晰,而且还有需要重构才能转换的局部变量。此外,函数不是自动执行的,必须被调用,而子例程只是被标记为代码段,因此它们需要额外的工作来避免被无意调用。事实上,Gosub的AHK手册页特别建议使用函数: 虽然GOSUB对于简单的通用子程序有用,但考虑使用函数以实现更复杂的目的。 子例程的一个明显缺点是它们不能接受参数 有没

AutoHotkey命令允许您自定义脚本通知区域图标的上下文菜单,但它似乎需要将标签/子例程附加到菜单项

我有一些函数,虽然我可以转换成子例程,但我不想转换,因为它们更容易使用,更清晰,而且还有需要重构才能转换的局部变量。此外,函数不是自动执行的,必须被调用,而子例程只是被标记为代码段,因此它们需要额外的工作来避免被无意调用。事实上,
Gosub
的AHK手册页特别建议使用函数:

虽然GOSUB对于简单的通用子程序有用,但考虑使用函数以实现更复杂的目的。

子例程的一个明显缺点是它们不能接受参数


有没有办法创建绑定到函数的菜单项?

您可以让每个子例程调用相应的函数。

如果正确使用
return
语句,子例程不会自动执行

通常,在每个子例程或多行热键(单行热键不需要)的末尾有一个
return
。(函数的执行在右大括号处终止,因此不需要返回,当然,除非您希望返回值,或在函数中的某个其他点终止。)

此外,请确保在脚本的自动执行部分之外定义任何子例程,以防止它在脚本启动时自动执行

有关AHK文档中“自动执行”部分的更多信息:

脚本完成后的脚本顶部(自动执行部分) 加载后,它开始在顶行执行,直到 返回、退出、热键/热字符串标签或 遇到脚本(以先到者为准)。这是最上面的部分 脚本称为自动执行部分

一个不持久且缺少热键、热字符串、, OnMessage和GUI将在自动执行部分完成后终止 完整的。否则,它将保持在空闲状态下运行, 响应诸如热键、热字符串、GUI事件、自定义 菜单项和计时器

编辑: 不幸的是,您仍然无法将方向函数调用绑定到菜单,因为这是不受支持的。 但是您可以从相应的子例程中调用函数(现在您知道如何防止它们自动运行)。通过全局公开某些状态,可以消除向函数传递参数的需要。然而,若您不想这样做,您可以简单地创建初始化为您想在那个点传递给“绑定”函数的任何值的变量,然后使用它们来进行您想进行的“绑定”函数调用的等价物。例如:

subroutine:
arg1 = <some expression>
arg2 = <some expression>
MyFunction(arg1, arg1)
return

MyFunction(a, b) 
....
}
子例程:
arg1=
arg2=
MyFunction(arg1,arg1)
返回
MyFunction(a,b)
....
}

如果我还是要创建子例程,那我为什么还要费心处理函数呢?我仍然需要重新考虑以防止子例程被执行(我了解到,自从我以前将函数放在顶部以来,最困难的是我想知道为什么在我将它们更改为子例程时脚本会冻结)。子例程将如何执行?因为子例程只不过是一个标签。如果代码块恰好在执行的中间(就像当我把脚本顶部的函数转换成子程序时,在函数名称“<代码>:<代码> >下替换<代码>())>代码>之后,标签下面的行将被执行。但只有独立的线路。AHK将不会执行子例程,直到它们被
GoSub
'd或用热键调用。它不会分支到脚本其他部分的子例程,但如果它们碍事,它将直接推送它们。>如果正确使用return语句,子例程不会自动执行。是的,我知道,我做到了(但还是把子程序移到了末尾)。但是这并不能回答这个问题。如果参数是全局的,为什么要传递它们(如果可以传递,为什么要使它们成为全局的)?@echristopherson,它们不是全局的,它们是字符串(至少在我的情况下)@echristopherson有两个原因可以解释为什么要这样做1)这样,函数实际依赖的值不是全局值,不能被外部代码意外修改。2) 现在,您可以递归地执行类似suff的调用(这通常要求函数具有传递给它的局部参数)[我对我的帖子进行了一些编辑以使其更清晰,特别是将变量g_arg1,g_arg2的名称改为简单的arg1,arg2,因为前者似乎暗示某些内部状态已被全局暴露,但事实并非如此]@肇事逃逸的选民,你有什么问题?不,真的;没有解释性的评论,我无法用这个问题来解决你可能遇到的任何问题(如果有任何感叹的话)。