为什么我的 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”,具体取决于第二个复选框是否选中。这就是我想要的样子。
但是,如果我按 Enter
或 NumpadEnter
,它只会发出“喵!”的声音。没有“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, New
的 documentation 描述了使用这两种方法中的任何一种的一些起伏。
但是,如果您只是坚持使用一个图形用户界面,而不是多个图形用户界面,也许为了简单起见,我建议您不要使用 Gui, New
,这样您就不必担心命名图形用户界面了。
我有这个代码:
#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”,具体取决于第二个复选框是否选中。这就是我想要的样子。
但是,如果我按 Enter
或 NumpadEnter
,它只会发出“喵!”的声音。没有“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, New
的 documentation 描述了使用这两种方法中的任何一种的一些起伏。
但是,如果您只是坚持使用一个图形用户界面,而不是多个图形用户界面,也许为了简单起见,我建议您不要使用 Gui, New
,这样您就不必担心命名图形用户界面了。