更灵活的自定义的Dialog类,可以用来平替内置的InputBox命令
AHK v1代码
#requires Autohotkey v1.0
answer := Dialog("输出结果:", "good")
MsgBox, % "you answered: " answer
ExitApp
Dialog(Question, DefaultValue := "") {
return new Dialog(Question, DefaultValue).Wait()
}
class Dialog
{
__New(Question, DefaultValue) {
Gui, New, +hwndhGui +LabelDialog.On_, Dialog
this.hwnd := hGui
Gui, Add, Text,, % Question
Gui, Add, Edit, w200 h100 hwndhEdit, %DefaultValue%
this.hEdit := hEdit
Gui, Add, Button, gDialog.On_ButtonSendAnswer, 确定
this.SaveStatus := False
Gui, Show
Dialog.Instances[hGui] := this
}
On_Close() {
MsgBox, 4, % " ", Do you want to close the window?
IfMsgBox, No
Return 1
Dialog.RemoveInstance(A_Gui)
}
On_ButtonSendAnswer() {
this := Dialog.Instances[A_Gui]
this.SaveStatus := True
Dialog.RemoveInstance(this.hwnd)
Gui, Cancel
}
RemoveInstance(hwnd) {
Dialog.Instances.Delete(hwnd)
}
Wait() {
dhw := A_DetectHiddenWindows
DetectHiddenWindows, Off
WinWaitClose, % "ahk_id " this.hwnd
DetectHiddenWindows, % dhw
If !this.SaveStatus
Return "not saved"
GuiControlGet, value,, % this.hEdit
return value
}
__Delete() {
Gui, % this.hwnd ":Destroy"
}
}
AHK v2代码
#Requires AutoHotkey v2.0
answer := myDialog("输出结果:", "good")
MsgBox("you answered: " . answer)
ExitApp
myDialog(Question, DefaultValue := "") {
return Dialog.Create(Question, DefaultValue).Wait()
}
class Dialog {
static Instances := Map()
static Create(Question, DefaultValue) {
return Dialog(Question, DefaultValue)
}
__New(Question, DefaultValue) {
this.gui := Gui()
this.gui.Add("Text", , Question)
this.edit := this.gui.Add("Edit", "w200 h100", DefaultValue)
this.MyBtn :=this.gui.Add("Button", "", "确定")
this.MyBtn.OnEvent("Click", this.On_ButtonSendAnswer)
this.SaveStatus := false
this.gui.OnEvent("Close", this.On_Close)
this.gui.Show()
Dialog.Instances[this.gui.Hwnd] := this
}
On_Close(*) {
if (MsgBox("Do you want to close the window?", " ", 4) = "No")
return true
Dialog.RemoveInstance(this)
}
On_ButtonSendAnswer(*) {
this := Dialog.Instances[this.gui.Hwnd]
this.SaveStatus := true
Dialog.RemoveInstance(this.gui)
this.gui.Hide()
}
static RemoveInstance(gui) {
Dialog.Instances.Delete(gui.Hwnd)
}
Wait() {
dhw := A_DetectHiddenWindows
DetectHiddenWindows(false)
WinWaitClose("ahk_id " . this.gui.Hwnd)
DetectHiddenWindows(dhw)
if (!this.SaveStatus)
return "not saved"
return this.edit.Value
}
__Delete() {
this.gui.Destroy()
}
}