如何在VSTO项目中区分Word手动保存、自动保存与自动恢复保存
区分Word手动保存、自动保存与自动恢复保存的解决方案
要在Word 2013及以上版本的VSTO项目中精准区分三种保存行为,可通过WordBasic内部属性+变量的组合实现,以下是具体实现方案:
核心区分逻辑
- 自动恢复保存:通过
WordBasic.IsAutosaveEvent属性识别,该属性在自动恢复场景下返回1。 - 自动保存(定时触发):在排除自动恢复的前提下,通过Word内部变量
AutosaveInProgress识别,自动保存时该变量值为1。 - 手动保存:排除上述两种情况后的保存操作,即用户主动触发的保存(如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
相关产品推荐
相关产品推荐

