AutoHotKey中动态更新n×2多维数组追加坐标值问题求解
常见问题
在AutoHotKey中,向初始为空的Array对象追加值、让数组随用户操作逐步填充内容时,容易遇到功能不生效的问题。
现有脚本
以下是可复现问题的精简脚本:设计目标为按下NumpadAdd键时,将当前鼠标位置存入名为list_of_mouse_positions的Array数组;采集若干点位后,按下Numpad0键即可查看当前已存储的所有点位。
;---------------; ; GENERAL SETUP ; ;---------------; coordmode Mouse, screen ; 初始化空数组用于存储鼠标位置 list_of_mouse_positions := Array() ;-----------; ; FUNCTIONS ; ;-----------; ; 把当前鼠标位置加入全局存储数组,参数x无实际作用 AddLocation(x) { MouseGetPos, xpos, ypos mouse_pos := Array() mouse_pos[1] := xpos mouse_pos[2] := ypos list_of_mouse_positions.Push(mouse_pos) } ;-------------; ; KEYBINDINGS ; ;-------------; ; 追加当前鼠标位置 NumpadAdd:: AddLocation(0) return ; 查看已存储的鼠标位置 NumPad0:: MsgBox, %list_of_mouse_positions% return
预期输出与实际输出差异
运行脚本后多次按下NumpadAdd采集坐标,再按下Numpad0时,预期弹出包含所有已采集坐标的消息框,实际仅弹出空白消息框。
具体问询
如何更新Array对象(即本场景中的list_of_mouse_positions变量),逐行追加存储两个新值的条目?
预期数组维度说明
预期list_of_mouse_positions为(n x 2)维度的多维数组,第一列存储所有x坐标值,第二列存储所有y坐标值。
例如用户采集到以下鼠标点位坐标:
- (100, 200)
- (400, 100)
- (600, 150)
对应list_of_mouse_positions结构如下:
list_of_mouse_positions[1,1] = 100 list_of_mouse_positions[1,2] = 200 list_of_mouse_positions[2,1] = 400 list_of_mouse_positions[2,2] = 100 list_of_mouse_positions[3,1] = 600 list_of_mouse_positions[3,2] = 150
问题原因与修复方案
问题根源有两处:
- 变量作用域错误:AutoHotKey v1 中函数内部默认只能访问局部变量,你在
AddLocation函数里操作的list_of_mouse_positions是函数内部生成的空局部变量,根本没有修改到全局定义的数组,所以全局数组从始至终都是空的,弹框自然没有内容。 - 数组输出逻辑错误:AHK v1 中直接用
MsgBox %数组对象%不会自动遍历打印数组内容,只会返回空值,需要手动遍历拼接字符串才能正常显示内容。
修复后的完整可运行代码如下:
;---------------; ; GENERAL SETUP ; ;---------------; coordmode Mouse, screen ; 声明全局存储数组 global list_of_mouse_positions := Array() ;-----------; ; FUNCTIONS ; ;-----------; AddLocation(x) { ; 声明要访问的全局数组变量 global list_of_mouse_positions MouseGetPos, xpos, ypos ; 直接将坐标对追加到全局数组,无需额外创建中间数组 list_of_mouse_positions.Push([xpos, ypos]) } ;-------------; ; KEYBINDINGS ; ;-------------; NumpadAdd:: AddLocation(0) return NumPad0:: ; 遍历数组拼接展示内容 showContent := "已存储的鼠标点位:`n" for index, pos in list_of_mouse_positions { showContent .= "第" index "个点位: (" pos[1] ", " pos[2] ")`n" } MsgBox, %showContent% return
修复后完全匹配预期需求:
- 每按一次
NumpadAdd就会将当前鼠标坐标追加到数组中,数组结构就是要求的n行2列格式,通过list_of_mouse_positions[行号,1]即可取对应行的x坐标,list_of_mouse_positions[行号,2]取对应行的y坐标。 - 按
Numpad0时会正常弹窗展示所有已采集点位,不会再出现空白弹框问题。
内容的提问来源于stack exchange,提问作者Felipe D.
相关产品推荐
相关产品推荐

