Hammerspoon脚本异常:执行截图后按钮点击流程中断
Hammerspoon脚本执行异常:截图后按钮点击序列中断
需求说明
- 对目标应用程序截图
- 识别截图中的文本内容
- 执行一系列按钮点击操作
- 递归重复上述流程
核心问题
代码中调用TakeScreenshot(win, rect, filename)后,脚本在执行完第一个按钮点击后会静默终止,无任何报错信息;若注释该行代码,脚本可正常完成所有流程:识别已保存截图的文本、执行完整按钮点击序列并递归运行。
已做排查
- 已将计时器存入
GlobalTimers,避免被垃圾回收 - 简化版本可复现问题:仅保留截图+两次按钮点击逻辑,注释截图步骤则功能正常,否则点击第一个按钮后停止
- 日志输出仅到
[DEBUG] Clicking button1,无后续记录 - 尝试过给
TakeScreenshot添加回调、增加操作延迟,问题未解决
解决方案建议
排查截图操作的阻塞性
Hammerspoon的截图API若为同步阻塞逻辑,可能打乱后续异步计时器的执行顺序。可将截图操作放入异步队列,或用hs.timer.doAfter延迟执行按钮点击,确保截图完全完成后再启动后续流程。确认系统权限
检查Hammerspoon是否已获得完整的屏幕录制权限(系统设置>隐私与安全性>屏幕录制),权限请求弹窗可能导致脚本上下文静默中断。强制捕获错误信息
在按钮点击的回调逻辑中用pcall包裹,捕获潜在的静默错误:local success, err = pcall(function() -- 按钮点击的具体代码 end) if not success then hs.logger.new("ButtonError"):err(err) end替换递归为定时器循环
递归调用结合截图操作可能引发内存泄漏或上下文异常,改用定时器循环实现重复流程:local function runCycle() TakeScreenshot(win, rect, filename) -- 文本识别逻辑 -- 按钮点击序列执行完成后,触发下一轮循环 hs.timer.doAfter(1, runCycle) end hs.timer.doAfter(0, runCycle)
替代方案
- 直接读取UI元素文本:若目标应用支持Accessibility,用
hs.uielement直接获取窗口元素的文本内容,跳过截图OCR步骤:local app = hs.application.find("TargetAppName") local targetElement = app:mainWindow():findElement({role = "staticText"}) local textContent = targetElement:attributeValue("AXValue") - 系统原生OCR调用:通过
hs.osascript.applescript调用系统自带OCR工具,直接处理屏幕区域,无需保存截图文件,减少IO操作风险。 - 第三方自动化工具:改用Keyboard Maestro或Alfred等工具,其UI交互与OCR集成更成熟,适合这类重复自动化流程。
内容的提问来源于stack exchange,提问作者Touniouk
相关产品推荐
相关产品推荐

