如何将使用 VarSetCapacity 的脚本转换为 AHK v2?

如何将使用 VarSetCapacity 的脚本转换为 AHK v2?

我一直在使用脚本高级窗口捕捉,将窗口捕捉到监视器的各个位置,使用函数从窗口获取监视器索引确定窗口位于哪个监视器。

我正在将其转换为 AHKv2。

到目前为止,我可以得到这个:

GetMonitorIndexFromWindow(windowHandle) {
    ; Starts with 1.
    monitorIndex := 1

; Original
;    VarSetCapacity(&monitorInfo, 40)
; My try
    monitorInfo := Buffer(40)
    NumPut("Uint", 40, monitorInfo)

    if (monitorHandle := DllCall("MonitorFromWindow", "uint", windowHandle, "uint", 0x2))
        && DllCall("GetMonitorInfoA", "uint", monitorHandle, "uint", &monitorInfo) {
        monitorLeft   := NumGet(monitorInfo,  4, "Int")
        monitorTop    := NumGet(monitorInfo,  8, "Int")
        monitorRight  := NumGet(monitorInfo, 12, "Int")
        monitorBottom := NumGet(monitorInfo, 16, "Int")
        workLeft      := NumGet(monitorInfo, 20, "Int")
        workTop       := NumGet(monitorInfo, 24, "Int")
        workRight     := NumGet(monitorInfo, 28, "Int")
        workBottom    := NumGet(monitorInfo, 32, "Int")
        isPrimary     := NumGet(monitorInfo, 36, "Int") & 1

        monitorCount := MonitorGetCount

        Loop %monitorCount% {
            tempMon := MonitorGet(%A_Index%, &tempMonLeft, &tempMonTop, &tempMonRight, &tempMonBottom)

            ; Compare location to determine the monitor index.
            if ((monitorLeft = tempMonLeft) and (monitorTop = tempMonTop)
                and (monitorRight = tempMonRight) and (monitorBottom = tempMonBottom)) {
                monitorIndex := A_Index
                break
            }
        }
    }
    return monitorIndex
}

但它不起作用,因为我替换 VarSetCapacity(monitorInfo, 40) 的方式似乎不是 DllCall 所期望的。

我也尝试了字符串或缓冲区,但 DllCall(第二个)抱怨“错误:预期是一个数字,但得到的是一个 VarRef。”。

事实上,我甚至不确定这个 DllCall 是否仍然需要,也许函数https://www.autohotkey.com/docs/v2/lib/Monitor.htm可以用来完全跳过它。

如何将该函数转换为与 AHK v2 兼容的语法?

相关内容