AHK脚本WinGetText获取内容为空,Window Spy却显示有内容的问题
AutoHotkey v1 脚本WinGetText无法获取目标窗口文本问题
问题详情
手动按下Alt+n后,v2版本的Window Spy显示目标窗口存在“Create New Prescription”可见文本,但在AutoHotkey v1脚本中出现以下异常:
- 通过
#IfWinActive指定目标窗口后,按Ctrl+J触发Send !n,WinGetActiveTitle能正确返回预期的窗口标题 WinGetText始终无法捕获到“Create New Prescription”文本,日志文件仅重复记录“ blah”内容- 已尝试的无效操作:省略
WinGetText的窗口标题参数、切换SetTitleMatchMode的Slow/Fast模式 - 版本混淆排查:发现误用v2版Window Spy,曾尝试引入v2的
WinGetTextFast()函数,因v1无WinGetControlsHwnd函数报错;同时存在本地查v1文档、线上看v2文档的版本错位问题,已定位方向但未解决。
现有v1脚本
#IfWinActive <Redacted title> ; 隐私信息已隐藏,该语句可正常匹配目标窗口 ^j:: Send, !n WinGetActiveTitle, title MsgBox, %title% ; 消息框显示预期的窗口标题 WinGetText, createNewPrescriptionTitle, title while (InStr(createNewPrescriptionTitle, "Create New Prescription") != 1) { Sleep, 1000 FileAppend, %createNewPrescriptionTitle% blah, log.txt ; 日志仅记录" blah blah blah..." WinGetText, createNewPrescriptionTitle, title } MsgBox, "Huzzah"
解决方案建议
- 修正窗口目标错误:
Send !n大概率会弹出新的“Create New Prescription”对话框/子窗口,而原脚本一直获取初始窗口的文本,自然找不到目标内容。可改用WinWait等待新窗口出现后再获取文本:
#IfWinActive <Redacted title> ^j:: Send, !n ; 等待新窗口加载,可根据窗口标题或文本匹配 WinWait, Create New Prescription ; 获取新窗口的文本 WinGetText, createNewPrescriptionTitle, Create New Prescription MsgBox, "Huzzah" return
- 使用窗口句柄提升准确性:
相比窗口标题,句柄更稳定,可通过WinGet获取新窗口句柄后再调用API获取文本:
#IfWinActive <Redacted title> ^j:: Send, !n WinWait, Create New Prescription WinGet, hWnd, ID, Create New Prescription ; 调用Windows API获取窗口文本 VarSetCapacity(windowText, 2048) DllCall("user32.dll\GetWindowText", "Ptr", hWnd, "Str", windowText, "Int", 2048) MsgBox, %windowText% return
- 替换v2函数的v1实现:
v1没有WinGetTextFast(),但可通过遍历控件获取文本,替代实现如下:
WinGetTextFast(hWnd) { text := "" WinGet, controls, ControlList, ahk_id %hWnd% Loop, Parse, controls, `n { ControlGetText, ctrlText, %A_LoopField%, ahk_id %hWnd% text .= ctrlText "`n" } return text }
调用时只需传入目标窗口句柄即可:createNewPrescriptionTitle := WinGetTextFast(hWnd)
- 统一版本工具:
使用v1对应的Window Spy(位于v1安装目录下的WindowSpy.ahk)排查窗口信息,避免用v2工具分析v1脚本问题,减少版本混淆。
内容的提问来源于stack exchange,提问作者user11302188
相关产品推荐
相关产品推荐

