如何在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
代码说明
- 获取活动窗口范围:
- 调用
FindText().WindowToScreen(X1, Y1, 0, 0):将活动窗口内的(0,0)坐标转换为屏幕坐标,得到窗口左上角的屏幕位置。 - 调用
FindText().WindowToScreen(X2, Y2, A_ScreenWidth, A_ScreenHeight):传入一个远大于窗口尺寸的窗口内坐标,获取窗口右下角的屏幕坐标(函数会自动返回窗口实际的右下角边界)。
- 调用
- 限定搜索范围:将获取到的
X1,Y1,X2,Y2作为FindText()的搜索区域参数,这样就只会在活动窗口的屏幕范围内搜索目标图形。 - 容错处理:在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
相关产品推荐
相关产品推荐

