为什么我的 AutoHotKey 脚本在按下 Enter/NumpadEnter 时不发送复选框——仅在单击按钮时发送?

Why does my AutoHotKey script not send the checkbox when pressing Enter/NumpadEnter -- only when clicking the button?

我有这个代码:

#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 框,显示“Meow!0”或“Meow!1”,具体取决于第二个复选框是否选中。这就是我想要的样子。

但是,如果我按 EnterNumpadEnter,它只会发出“喵!”的声音。没有“0”或“1”;复选框值被忽略。

这怎么可能?昨天和今天为此骂了几个小时,无助地翻了翻说明书,翻找了一无所获。

总的来说,我觉得 AutoHotKey 很奇怪。

(我也尝试在每个 Gosub 之后添加 return,以及许多其他内容。)

这确实是一件很奇怪的事情。
我会说在我为你写的另一个答案中使用 Gui, New 是我的错误。

Gui, New 创建一个新的图形用户界面,并将其设置为默认图形用户界面,就像任何其他创建图形用户界面的方法一样。 但是它只是将其设置为当前线程的默认 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, New,你可以这样做:

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, Newdocumentation 描述了使用这两种方法中的任何一种的一些起伏。
但是,如果您只是坚持使用一个图形用户界面,而不是多个图形用户界面,也许为了简单起见,我建议您不要使用 Gui, New,这样您就不必担心命名图形用户界面了。