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

如何在VSTO项目中区分Word手动保存、自动保存与自动恢复保存

区分Word手动保存、自动保存与自动恢复保存的解决方案

要在Word 2013及以上版本的VSTO项目中精准区分三种保存行为,可通过WordBasic内部属性+变量的组合实现,以下是具体实现方案:

核心区分逻辑

  1. 自动恢复保存:通过WordBasic.IsAutosaveEvent属性识别,该属性在自动恢复场景下返回1。
  2. 自动保存(定时触发):在排除自动恢复的前提下,通过Word内部变量AutosaveInProgress识别,自动保存时该变量值为1。
  3. 手动保存:排除上述两种情况后的保存操作,即用户主动触发的保存(如Ctrl+S、点击保存按钮)。

代码实现

using System.Reflection;
using Word = Microsoft.Office.Interop.Word;

public void Application_DocumentBeforeSave(Word.Document doc, ref bool SaveAsUI, ref bool Cancel)
{
    object wordBasic = Application.WordBasic;
    Type wordBasicType = wordBasic.GetType();

    // 1. 识别自动恢复保存
    object isAutoRecoverySave = wordBasicType.InvokeMember(
        "IsAutosaveEvent",
        BindingFlags.GetProperty,
        null,
        wordBasic,
        null);
    bool isAutoRecovery = int.Parse(isAutoRecoverySave.ToString()) == 1;
    
    if (isAutoRecovery)
    {
        // 自动恢复保存,跳过操作
        return;
    }

    // 2. 识别自动保存(定时触发)
    object autoSaveInProgress = wordBasicType.InvokeMember(
        "GetVar",
        BindingFlags.InvokeMethod,
        null,
        wordBasic,
        new object[] { "AutosaveInProgress" });
    bool isAutoSave = int.Parse(autoSaveInProgress.ToString()) == 1;
    
    if (isAutoSave)
    {
        // 自动保存,跳过操作
        return;
    }

    // 3. 手动保存,执行自定义操作
    // --- 此处添加你的特定操作逻辑 ---
    // 示例:
    doc.Range().InsertAfter("手动保存触发的操作已执行");
}

备选方案(若AutosaveInProgress不可用)

如果部分Word版本中AutosaveInProgress变量无法读取,可通过线程消息循环判断:自动保存由后台线程触发,无UI消息循环;手动保存在UI线程执行,存在消息循环。需先引用System.Windows.Forms程序集:

// 替换自动保存识别的代码段
bool isAutoSave = !System.Windows.Forms.Application.MessageLoop;

注意事项

  • AutosaveInProgress是Word内部维护的变量,在Word 2013及以上版本中稳定可用。
  • 若用户执行「另存为」操作,SaveAsUI会返回true,该场景也属于手动操作,可根据需求将其纳入手动保存逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 21:57:09