使用Polyethene库中GuiControlGet函数获取控件宽度报错求助
问题分析与修复方案
错误原因
- 参数传递错误:原命令
GuiControlGet, OutputVar, Pos,% var中的% var是展开变量值,实际传递的是控件文本Hello world作为ControlID;但你调用自定义函数时传了字符串"var",导致函数找不到对应控件,局部变量v未被赋值,触发错误。 - Pos子命令的特殊行为:原生
GuiControlGet的Pos子命令不会给主输出变量赋值,而是自动创建OutputVarX、OutputVarY、OutputVarW、OutputVarH四个后缀变量。你的自定义函数仅返回空的主变量v,且函数内的局部变量及其后缀会在执行结束后销毁,外部无法访问OutPutW。
修复代码示例
方案1:返回包含位置信息的对象
这种方式更符合函数式编程的习惯,直接返回结构化的位置数据:
var := "Hello world" Gui HUD:New, +AlwaysOnTop +ToolWindow -Caption +HwndMainHwnd, hudWin Gui HUD:Font,s14,Consolas Gui, Add, Text,,% var GuiControlGet, OutputVar, Pos,% var Gui HUD:Show, x300 y300 w300 h300 msgbox,% outputVarW ; 原生命令正常返回宽度 ; 修复:传递var的实际值,而非字符串"var" OutPut := GuiControlGet("Pos", var) msgbox,% OutPut.W ; 从返回对象中获取宽度 GuiControlGet(Subcommand = "", ControlID = "", Param4 = "") { if (Subcommand = "Pos") { ; 收集Pos子命令生成的位置变量 GuiControlGet, temp, Pos, %ControlID%, %Param4% return {X: tempX, Y: tempY, W: tempW, H: tempH} } else { ; 其他子命令按原逻辑处理 GuiControlGet, v, %Subcommand%, %ControlID%, %Param4% return v } }
方案2:模仿原生命令的变量赋值行为
这种方式完全复刻原生命令的用法,通过动态变量名在外部创建后缀变量:
var := "Hello world" Gui HUD:New, +AlwaysOnTop +ToolWindow -Caption +HwndMainHwnd, hudWin Gui HUD:Font,s14,Consolas Gui, Add, Text,,% var GuiControlGet, OutputVar, Pos,% var Gui HUD:Show, x300 y300 w300 h300 msgbox,% outputVarW ; 原生命令正常返回宽度 ; 修复:传递输出变量名、子命令和控件标识 GuiControlGet("OutPut", "Pos", var) msgbox,% OutPutW ; 直接访问后缀变量 ; 调整函数参数:第一个参数为输出变量名 GuiControlGet(OutputVarName = "", Subcommand = "", ControlID = "", Param4 = "") { if (OutputVarName = "") return "" ; 使用动态变量名调用原生命令,在外部生成后缀变量 GuiControlGet, %OutputVarName%, %Subcommand%, %ControlID%, %Param4% return %OutputVarName% }
内容的提问来源于stack exchange,提问作者Ralf_Reddings
相关产品推荐
相关产品推荐

