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

如何在FindText中配合使用WindowToScreen()辅助函数?

解决FindText库在多显示器环境下仅搜索活动窗口的问题

问题背景

使用FindText库识别数字"4"时,原代码采用全屏幕范围搜索,在多显示器环境下速度慢且会匹配其他窗口/显示器的内容。虽尝试硬编码小范围坐标提升速度,但窗口移动后失效。希望利用WindowToScreen()函数限定仅在活动窗口内搜索,但多次尝试代码结合失败。

错误原因

之前的代码错误地将WindowToScreen()与FindText()进行链式调用,未正确理解该函数的作用:WindowToScreen()是用来将窗口内的局部坐标转换为屏幕坐标,或获取整个窗口的屏幕范围边界,而非直接作为FindText的调用前缀。

正确实现代码

#Include <FindText>
F1::
t1 := A_TickCount, Text := ""
Text := "|<4>**50$6.66CCKqz66U"

; 获取活动窗口的屏幕坐标范围:X1,Y1是窗口左上角,X2,Y2是窗口右下角
FindText().WindowToScreen(X1, Y1, 0, 0)  ; 窗口内(0,0)对应屏幕左上角
FindText().WindowToScreen(X2, Y2, A_ScreenWidth, A_ScreenHeight)  ; 用足够大的窗口内坐标获取窗口右下角屏幕坐标

; 在活动窗口的屏幕范围内搜索目标文本
if (ok := FindText(X, Y, X1, Y1, X2, Y2, 0, 0, Text))
{
    ; 识别成功后的逻辑(可选)
}

MsgBox, 4096, Tip, % "Found:`t" Round(ok.Length())
    . "`n`nTime:`t" (A_TickCount-t1) " ms"
    . (ok.Length() ? "`n`nPos:`t" ok[1].x ", " ok[1].y : "")
    . (ok.Length() ? "`n`nResult:`t<" ok[1].id ">" : "")

for i,v in ok
    if (i <= 2)
        FindText().MouseTip(ok[i].x, ok[i].y)
return

代码说明

  1. 获取活动窗口范围:
    • 调用FindText().WindowToScreen(X1, Y1, 0, 0):将活动窗口内的(0,0)坐标转换为屏幕坐标,得到窗口左上角的屏幕位置。
    • 调用FindText().WindowToScreen(X2, Y2, A_ScreenWidth, A_ScreenHeight):传入一个远大于窗口尺寸的窗口内坐标,获取窗口右下角的屏幕坐标(函数会自动返回窗口实际的右下角边界)。
  2. 限定搜索范围:将获取到的X1,Y1,X2,Y2作为FindText()的搜索区域参数,这样就只会在活动窗口的屏幕范围内搜索目标图形。
  3. 容错处理:在MsgBox中增加了判断,避免识别失败时访问ok[1]导致报错。

补充说明

如果需要指定活动窗口内的局部区域而非整个窗口搜索,可先确定窗口内的目标区域坐标(比如窗口内(100,200)到(300,400)),再通过WindowToScreen()转换为屏幕坐标,传给FindText:

; 转换窗口内局部区域为屏幕坐标
FindText().WindowToScreen(AreaX1, AreaY1, 100, 200)
FindText().WindowToScreen(AreaX2, AreaY2, 300, 400)
; 在该局部屏幕区域搜索
if (ok := FindText(X, Y, AreaX1, AreaY1, AreaX2, AreaY2, 0, 0, Text))
{
    ; ...
}

内容的提问来源于stack exchange,提问作者Ralf_Reddings

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 14:07:40