Windows 为什么我的自动热键脚本在按Enter/NumpadEnter时不发送复选框--仅在单击按钮时才发送?

Windows 为什么我的自动热键脚本在按Enter/NumpadEnter时不发送复选框--仅在单击按钮时才发送?,windows,autohotkey,Windows,Autohotkey,我有以下代码: #Persistent #SingleInstance Off Gui, New, -MinimizeBox, % "Test" Gui, Add, Edit, vUserInput w300 Gui, Add, Checkbox, vMyCheckbox1, % "Ceckbox one" Gui, Add, Checkbox, vMyCheckbox2, % "Checkbox two" Gui, Add, But

我有以下代码:

#Persistent
#SingleInstance Off

Gui, New, -MinimizeBox, % "Test"
Gui, Add, Edit, vUserInput w300
Gui, Add, Checkbox, vMyCheckbox1, % "Ceckbox one"
Gui, Add, Checkbox, vMyCheckbox2, % "Checkbox two"
Gui, Add, Button, gOkButtonPress w50 h25 x80, % "OK"
Gui, Show, Center
return

Enter::
Gosub, OkButtonPress

NumpadEnter::
Gosub, OkButtonPress

OkButtonPress:
    Gui, Submit
    MsgBox, Meow! %MyCheckbox2%
    ExitApp
return
如果我运行它并单击“确定”按钮,它会弹出一个GUI框,显示“喵!0”或“喵!1”,具体取决于第二个复选框是否选中。这就是我想要的

但是,如果我按
Enter
NumpadEnter
,它只会发出“喵喵”声,没有“0”或“1”;复选框值将被忽略

这怎么可能?昨天和今天,我已经为此诅咒了好几个小时,无助地试图阅读手册并搜索,但什么也没找到

我发现自动热键通常非常奇怪


(我还尝试在每个
Gosub
s和许多其他东西之后添加
return

这确实是一件非常奇怪的事情。
我要说的是,在我为您编写的另一个答案中使用
Gui,New
是我的错

Gui,New
创建一个新的Gui,并将其设置为默认Gui,就像任何其他创建Gui的方法一样它仅将其设置为当前线程的默认gui。
因此,当您运行热键时,您处于热键线程中。
在该线程中,它不是默认gui,而名为
1
的gui是默认gui。
因此,对
Gui,Submit
的调用试图引用Gui
1
,但它不存在

您可以通过命名gui,然后通过名称引用gui来解决此问题:

Gui, MyCoolGui:New, -MinimizeBox, % "Test" ;name the gui
Gui, Add, Edit, vUserInput w300
Gui, Add, Checkbox, vMyCheckbox1, % "Ceckbox one"
Gui, Add, Checkbox, vMyCheckbox2, % "Checkbox two"
Gui, Add, Button, gOkButtonPress w50 h25 x80, % "OK"
Gui, Show, Center
;each of the gui commands couldve been explicitly specified
;to operate on the named gui "MyCoolGui" like MyCoolGui:Add, MyCoolGui:Show
;but it's redundant
return

Enter::         ;no need to gosub, or goto, 
NumpadEnter::   ;just stack the hotkeys and labels
OkButtonPress:  ;like this
    Gui, MyCoolGui:Submit   ;refer to our named gui
    MsgBox, % "Meow! " MyCheckbox2
    ExitApp
return
或者,您不能使用新的
Gui,您可以这样做:

Gui, -MinimizeBox
Gui, Add, Edit, vUserInput w300
Gui, Add, Checkbox, vMyCheckbox1, % "Ceckbox one"
Gui, Add, Checkbox, vMyCheckbox2, % "Checkbox two"
Gui, Add, Button, gOkButtonPress w50 h25 x80, % "OK"
Gui, Show, Center, % "Test" ;give a title on the show command
return

Enter::         
NumpadEnter::   
OkButtonPress:  
    Gui, Submit 
    MsgBox, % "Meow! " MyCheckbox2
    ExitApp
return
对于
Gui,新的
描述了使用这两种方法的一些起伏。

但是如果您只使用一个gui,而不是多个gui,为了简单起见,我建议您不要使用
gui,New
,这样您就不必担心gui的命名问题。

这确实是一件非常奇怪的事。
我要说的是,在我为您编写的另一个答案中使用
Gui,New
是我的错

Gui,New
创建一个新的Gui,并将其设置为默认Gui,就像任何其他创建Gui的方法一样它仅将其设置为当前线程的默认gui。
因此,当您运行热键时,您处于热键线程中。
在该线程中,它不是默认gui,而名为
1
的gui是默认gui。
因此,对
Gui,Submit
的调用试图引用Gui
1
,但它不存在

您可以通过命名gui,然后通过名称引用gui来解决此问题:

Gui, MyCoolGui:New, -MinimizeBox, % "Test" ;name the gui
Gui, Add, Edit, vUserInput w300
Gui, Add, Checkbox, vMyCheckbox1, % "Ceckbox one"
Gui, Add, Checkbox, vMyCheckbox2, % "Checkbox two"
Gui, Add, Button, gOkButtonPress w50 h25 x80, % "OK"
Gui, Show, Center
;each of the gui commands couldve been explicitly specified
;to operate on the named gui "MyCoolGui" like MyCoolGui:Add, MyCoolGui:Show
;but it's redundant
return

Enter::         ;no need to gosub, or goto, 
NumpadEnter::   ;just stack the hotkeys and labels
OkButtonPress:  ;like this
    Gui, MyCoolGui:Submit   ;refer to our named gui
    MsgBox, % "Meow! " MyCheckbox2
    ExitApp
return
或者,您不能使用新的
Gui,您可以这样做:

Gui, -MinimizeBox
Gui, Add, Edit, vUserInput w300
Gui, Add, Checkbox, vMyCheckbox1, % "Ceckbox one"
Gui, Add, Checkbox, vMyCheckbox2, % "Checkbox two"
Gui, Add, Button, gOkButtonPress w50 h25 x80, % "OK"
Gui, Show, Center, % "Test" ;give a title on the show command
return

Enter::         
NumpadEnter::   
OkButtonPress:  
    Gui, Submit 
    MsgBox, % "Meow! " MyCheckbox2
    ExitApp
return
对于
Gui,新的
描述了使用这两种方法的一些起伏。
但是如果您只使用一个gui,而不是多个gui,为了简单起见,我建议您不要使用
gui,New
,这样您就不必担心gui的命名问题