mcpField
A
autohotkey-v2-gui

autohotkey-v2-gui

github.com/sarfraznawaz2005开发1111 次安装20 周前更新
代码仓库

关于 autohotkey-v2-gui

面向 AutoHotkey v2 GUI 开发的技能,提供复杂界面、事件处理和性能优化模式。适合构建多控件应用,并强调 v2 的事件与属性用法。

主要功能

  1. 01使用 OnEvent 处理事件
  2. 02通过 Submit() 获取表单数据
  3. 03管理控件可见性与布局
  4. 04构建 ListView 和 Tab 界面
  5. 05优化大数据内存与容量

适用场景

  1. 01创建多控件 GUI 应用
  2. 02实现事件驱动界面
  3. 03优化 GUI 性能与内存
  4. 04构建带校验的 ComboBox

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/sarfraznawaz2005/agent-skills-collection --skill autohotkey-v2-gui

安装后在 Claude Code 中输入/autohotkey-v2-gui确认已加载。

详细介绍

AutoHotkey v2 GUI 应用程序

AutoHotkey v2 高级 GUI 开发模式与优化技巧。

适用场景

  • 构建包含多个控件的复杂 GUI 应用程序
  • 实现事件驱动的用户界面
  • 优化 GUI 性能和内存使用
  • 使用 ListView、ComboBox、Tab 等高级控件

关键规则

事件处理:使用 OnEvent 方法,而不是 g-label

; WRONG - v1 g-label syntax
MyGui.Add("Button", "gButtonClick", "OK")

; RIGHT - v2 OnEvent method
Btn := MyGui.Add("Button", "w80", "OK")
Btn.OnEvent("Click", ButtonClick)

数据提交:使用带变量名的 Submit() 方法

; WRONG - accessing controls directly
EditText := MyGui["MyEdit"].Text

; RIGHT - Submit returns object with named values
MyGui.Add("Edit", "vUserName")
Data := MyGui.Submit()
UserName := Data.UserName

控件可见性:使用 Visible 属性,而不是 Show/Hide 命令

; WRONG - v1 command syntax
GuiControl, Hide, MyButton

; RIGHT - v2 property syntax
MyButton.Visible := false

关键模式

基本 GUI 结构
MyGui := Gui("+Resize", "Application Title")
MyGui.OnEvent("Close", AppClose)

; Add controls with variables for data retrieval
NameEdit := MyGui.Add("Edit", "vUserName w200")
SubmitBtn := MyGui.Add("Button", "Default w80", "OK")
SubmitBtn.OnEvent("Click", ProcessForm)

MyGui.Show("w300 h150")

ProcessForm(*) {
    Data := MyGui.Submit()
    MsgBox("Hello " . Data.UserName)
}

AppClose(*) {
    ExitApp
}
带事件处理的 ListView
MyGui := Gui()
LV := MyGui.Add("ListView", "r20 w700", ["Name", "Size (KB)"])
LV.OnEvent("DoubleClick", LV_DoubleClick)

; Populate ListView
Loop Files, A_MyDocuments "\*.*"
    LV.Add(, A_LoopFileName, A_LoopFileSizeKB)

LV.ModifyCol()  ; Auto-size columns
LV.ModifyCol(2, "Integer")  ; Enable numeric sorting

LV_DoubleClick(LV, RowNumber) {
    RowText := LV.GetText(RowNumber)
    MsgBox("Selected: " . RowText)
}
布局有序的 Tab 控件
MyGui := Gui()
Tab := MyGui.Add("Tab3",, ["Settings", "Data", "Output"])

; First tab controls
MyGui.Add("CheckBox", "vAutoStart", "Start automatically")
MyGui.Add("ComboBox", "vTheme", ["Light", "Dark", "Auto"])

; Second tab controls  
Tab.UseTab(2)
MyGui.Add("Edit", "vDataPath w200")
MyGui.Add("Button", "x+10 yp", "Browse...")

; Third tab controls
Tab.UseTab(3)
MyGui.Add("Edit", "vOutput r10 w300")

Tab.UseTab()  ; End tab association
MyGui.Add("Button", "Default", "Apply")
模态对话框模式
MainGui := Gui("+Resize", "Main Window")
MainGui.Opt("+OwnDialogs")  ; Make dialogs modal

ShowSettingsBtn := MainGui.Add("Button", "w100", "Settings")
ShowSettingsBtn.OnEvent("Click", ShowSettings)

ShowSettings(*) {
    ; Modal dialogs prevent interaction with main window
    Result := MsgBox("Save current settings?", "Confirm", "YesNoCancel")
    if (Result = "Yes") {
        ; Save logic here
    }
}

性能优化

大量数据的内存管理
; Pre-allocate string capacity for concatenation
VarSetStrCapacity(&LargeString, 5120000)  ; ~10 MB

Loop Files, "C:\*.*", "R"
    LargeString .= A_LoopFileFullPath . "`n"

; Free memory when done
LargeString := ""
对象容量调整
; Pre-allocate array/map capacity for performance
DataArray := []
DataArray.Capacity := 1000  ; Avoid frequent reallocation

DataMap := Map()
DataMap.Capacity := 500

高级控件模式

带验证的 ComboBox
ColorBox := MyGui.Add("ComboBox", "vColor", ["Red", "Green", "Blue"])
ColorBox.OnEvent("Change", ValidateColor)

ValidateColor(Ctrl, *) {
    if (Ctrl.Text = "Red")
        MsgBox("Warning: Red selected!")
}
动态控件管理
; Get control position for dynamic layouts
MyEdit.GetPos(&x, &y, &w, &h)
NewBtn := MyGui.Add("Button", "x" . (x + w + 10) . " y" . y, "Next")

; Retrieve control values without Submit
CurrentText := ControlGetText("Edit1", MyGui.Hwnd)

常见错误

  • 缺少变量名:控件需要以“v”为前缀,Submit() 才能获取其值
  • 位置设置错误:使用“xm ym”重置到边距位置,使用“x+m y+m”进行相对定位
  • 事件处理程序参数:现代事件处理程序接收 (Ctrl, Info) 参数,而不仅仅是 (*)
  • 窗口激活时机:显示后台窗口时使用 NoActivate 选项,以避免抢占焦点

评论

支持 Markdown