如何通过CEP/JavaScript检测Photoshop文档关闭事件
Photoshop扩展文档关闭行为检测实现方案
Photoshop原生ExtendScript DOM层没有直接暴露beforeClose事件,你写的app.addEventListener('beforeClose', detectClose)写法默认不生效,不需要用定时器轮询文档列表,以下是可直接落地的无性能损耗方案:
方案1:CEP架构扩展(兼容PS CC及以上所有版本)
CEP扩展可以直接通过宿主事件通道监听文档生命周期事件,不需要轮询:
- 面板前端侧通过CSInterface注册事件监听,关闭前触发对应
documentBeforeClose事件,关闭完成触发documentAfterClose事件,示例代码:
// CEP面板前端逻辑 const csInterface = new CSInterface(); // 监听文档关闭前事件 csInterface.addEventListener("documentBeforeClose", (event) => { // event.data携带当前即将关闭的文档元信息,包含文档ID、名称、路径等 const currentDoc = JSON.parse(event.data); // 在这里执行服务端上报逻辑 reportToServer(currentDoc); });
- 如果逻辑需要写在ExtendScript侧,可以通过
Notifier对象注册四字符事件触发,文档关闭对应的四字符事件码为Cls(末尾带半角空格,固定4位长度),注册后关闭操作会自动触发指定处理脚本:
// ExtendScript侧逻辑 const closeNotifier = app.notifiers.add( "Cls ", new File("~/your-ext-path/handler/closeReport.jsx") ); // closeReport.jsx内写上报逻辑即可,触发时会自动拿到当前操作的文档对象
方案2:UXP架构扩展(适用于PS 2021及以上新版本)
如果是基于新版UXP框架开发的扩展,PS已经原生暴露了文档生命周期事件,直接注册监听即可:
// UXP扩展入口逻辑 const psApp = require('photoshop').app; psApp.on('beforeDocumentClose', async (event) => { const closingDoc = event.document; // 执行上报逻辑 await uploadCloseInfo(closingDoc); });
注意事项
- 定时器轮询文档列表的方案仅建议作为CS6及更早老旧版本的兜底方案,新版本下优先使用上述事件监听方案,无额外性能开销,也不会出现漏报、延迟问题。
- 所有监听方案都无法覆盖程序崩溃、强制杀进程、系统断电这类非正常退出场景,这类场景需要做会话兜底:扩展启动时校验上次会话的关闭标记,如果没有正常关闭标记则补报异常退出日志。
内容的提问来源于stack exchange,提问作者Fitspade
相关产品推荐
相关产品推荐

