You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

问题原因与修复方案

问题根源有两处:

  1. 变量作用域错误:AutoHotKey v1 中函数内部默认只能访问局部变量,你在AddLocation函数里操作的list_of_mouse_positions是函数内部生成的空局部变量,根本没有修改到全局定义的数组,所以全局数组从始至终都是空的,弹框自然没有内容。
  2. 数组输出逻辑错误: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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 06:18:21