Как проверить, вызывает ли Word 2007 автосохранение в надстройке Word?

У меня есть некоторые функции внутри обработчика событий DocumentBeforeSave.
Это должно работать только тогда, когда пользователь вручную вызывает Сохранить (нажимает кнопку Сохранить).
Но в Word 2007 есть функция автосохранения, и событие DocumentBeforeSave выбрасывается каждый раз, когда работает автосохранение. Как проверить, что сохранение вызывается через автосохранение или пользователь вручную вызывает сохранение?


person digor_ua    schedule 20.06.2011    source источник


Ответы (2)


Похоже, что нет встроенного способа сделать это, потому что объектная модель просто не поддерживает его (согласно по этой ссылке), но вы можете использовать VBA, чтобы переопределить горячую клавишу сохранения по умолчанию и нажатие кнопки, и отправить эти вызовы в сборку .NET ( по этой ссылке). Просто убедитесь, что после этого вы вызываете сохранение вручную, чтобы убедиться, что документ действительно сохраняется.

person Greg Jackson    schedule 20.06.2011
comment
Грег, Спасибо. Ваш ответ очень полезен для меня - person digor_ua; 21.06.2011

На самом деле есть несколько способов определить разницу.

Вариант 1 (лучший)

Application.WordBasic.IsAutosaveEvent

Вариант 2 (что я сделал, прежде чем нашел вариант 1)

  • Перехватите команду FileSave (и FileSaveAs) с ленты:

    <customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="Ribbon_Load">
       <commands>
         <command idMso="FileSave" onAction="SaveIntercept" />
       </commands>
     </customUI>
    
  • Установите флаг в методе SaveIntercept и задайте для CancelDefault значение false, чтобы сохранение продолжалось.

    public void SaveIntercept(IRibbonControl control, ref bool CancelDefault)
    {
        logger.Info("Intercepted Manual Save");
        ManualSave = true;
        CancelDefault = false;
    }
    
  • Также реализуйте BeforeDocument_BeforeSave и установите там флаг. Если флаг был установлен, это было сделано вручную, в противном случае это автосохранение (или потенциально исходит из другой надстройки; не уверен, что это работает).

    bool quit = !customizations.ManualSave;
    if (quit)
    {
        logger.Info("Autosave. Allowing Word to handle this save.");
        e.Cancel = false;
        return;
    }
    else
    {
        logger.Info("Manual save. Proceeding.");
        customizations.ManualSave = false;
    }
    

Это относится к сохранению с помощью кнопок за кулисами, кнопок панели быстрого доступа и сочетания клавиш для сохранения (даже если они переопределяют сочетание клавиш).

Интересно, что есть способ сказать это и после сохранения, как описано здесь (обновленная версия здесь).

person Chris    schedule 04.02.2016