微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

AHK 如何将变量传递给函数内部的“运行”?

如何解决AHK 如何将变量传递给函数内部的“运行”?

我对自动热键相当陌生,最近在尝试将变量作为自动热键中“运行”命令的参数传递时遇到了一个问题。任何人都可以告诉我我缺少什么还是这是一个错误

Gui,Setup:Add,Edit,w100 vProgram
Gui,Button,Default w100 gSubmit,OK
Gui,Setup:Show,Setup
WinWaitClose,Setup
ExitApp

Submit:
    Gui,Setup:Submit
    RunStuff()

RunStuff() {
    Run,%Program%
}

我什至尝试将行更改为:

RunStuff() {
    run,Program
}

非常感谢您的帮助,提前致谢。

解决方法

首先,同时

WinWaitClose,Setup
ExitApp

也许是聪明的想法,您应该通过定义名称为 GuiClose 的函数(或标签)来使用 GuiClose event 做到这一点。

GuiClose()
{
    ExitApp
}

另外,给 gui 一个名字是多余的,尽管如果你打算添加更多的 gui,那就足够了。

要运行 cmd 命令,您需要使用 /c(docs) 开关启动 cmd。
您的示例 netsh wlan connect ssid=%networkname% name=%networkname% 会这样做:

networkname := "name"
Run,%A_ComSpec% /c netsh wlan connect ssid=%networkname% name=%networkname%
Run,% A_ComSpec " /c netsh wlan connect ssid=" networkname " name=" networkname

第一行是旧语法,我真的不推荐它。
第二行是表达式语法。

内置变量 A_ComSpec(docs) 包含 cmd.exe 的路径。

基于您的代码在记事本中打开文件的示例程序:

Gui,Setup:Add,Edit,w300 vFilePath,% "C:\Users\User\Desktop\this is a text file.txt"
Gui,Button,Default w100 gSubmit,OK
Gui,Setup:Show,Setup
return

Submit:
    Gui,Setup:Submit
    Run,% "notepad.exe """ FilePath """"
return

GuiClose()
{
    ExitApp
}

注意文件路径如何包含空格,因此参数需要用引号括起来。
"""" 可能看起来很奇怪,但在 AHK 中引用是 escaped 与另一个引用。因此,外部引号指定您正在编写字符串,而内部 "" 只是一个转义的引号。所以这会产生 "

在学习 AHK 时,遗留语法与现代表达式语法可能会有点混乱。当您查找内容时,您会看到很多遗留语法。这主要是因为 AHK 在几年前更加流行(当时可以使用遗留语法)。
要开始了解遗留与现代表达的差异,这里有一个非常好的文档页面:
https://www.autohotkey.com/docs/Language.htm


编辑:
回答通过编辑添加到 OP 中的新问题。

RunStuff() {
    Run,%Program%
}

变量 Program 未在函数作用域中定义。

让我们考虑这个示例代码

var1        := 1
var2        := 2
global var3 := 3
function()
return

function()
{
    global var2
    MsgBox,% "var1: " var1 "`nvar2: " var2 "`nvar3: " var3 "`n"
}

var1 未在函数作用域中定义,因此消息框中不会打印任何内容。
由于 var2 行,global var2 将在函数作用域之外使用。
var3 也可以在函数作用域之外使用,因为 var3 被定义为超级全局。真的不推荐超级全局,因为任何地方都将使用该变量。在较大的脚本上很容易遇到问题,但对于较小的脚本来说很方便,例如,您知道自己将要做什么并且没有任何外部库。
您可以从这里阅读相关文档:
https://www.autohotkey.com/docs/Functions.htm#Locals

,

您似乎认为您的问题出在 gui 输出上。

我认为您可能想以不同的方式检查:

您可以创建一个脚本来分析您的运行输入。

例如:

脚本 #1,我们称之为“1.ahk”

Run,2.ahk param1 param 2 "param 3"

脚本 #2,我们称之为“2.ahk”

txt := "Params as seen by ahk:`n"
for i,param in A_Args
    txt .= i " = " param "`n"
MsgBox % txt

通过运行脚本“1.ahk”你可以看到“2.ahk”创建的消息:

Params as seen by ahk:
1 = param1
2 = param
3 = 2
4 = param 3

我认为这很能说明它如何理解空格以及引号如何防止拆分参数。

现在,如果您针对“2.ahk”运行 gui 输出,您可能会看到与之前看到的有所不同的内容。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。