Word“另存为”对话框中的拦截保存事件

时间:2016-08-26 06:46:28

标签: c# ms-word vsto

在Word中,我有一个打开的文档 - 我在“另存为”对话框中导航到一个目录并选择一个现有文件。当我现在单击“保存”而不是“取消”时,如果我想覆盖/合并现有文档,则会收到消息。

是否可以拦截“另存为”对话框中的“保存”事件,以便我可以更改打开文档的文件名,从而禁止覆盖/合并消息?非常感谢任何建议!

2 个答案:

答案 0 :(得分:2)

是的,完全有可能拦截Word命令。在VBA时代,它就像创建一个与内部Word命令同名的宏一样简单。

在VSTO中,您需要将命令覆盖添加到Ribbon XML中,然后向代码添加回调。

MSDN中描述了整个过程: Temporarily Repurpose Commands on the Office Fluent Ribbon

示例功能区XML (覆盖标准保存命令)

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" 
   onLoad="OnLoad" > 
   <commands> 
     <command idMso="FileSave" onAction="mySave" /> 
   </commands> 
   <ribbon startFromScratch="false"> 
     <tabs> 
       <tab id="tab1" label="Repurpose Command Demo" > 
         <group id="group1" label="Demo Group"> 
           <toggleButton id="togglebutton1"  
             imageMso="AcceptInvitation"  
             size="large"  
             label="Alter Built-ins"  
             onAction="changeRepurpose" /> 
         </group> 
       </tab> 
     </tabs> 
   </ribbon> 
</customUI>

功能区回调

public void mySave(IRibbonControl control, bool cancelDefault)
{
    MessageBox.Show("The Save button has been temporarily repurposed.");
    cancelDefault = false;
}

答案 1 :(得分:1)

您可以像这样替换自己的Office对话框

https://msdn.microsoft.com/en-us/library/sfezx97z(v=vs.110).aspx

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
    Globals.ThisAddIn.Application.DocumentBeforeSave += Application_DocumentBeforeSave;

}    

void Application_DocumentBeforeSave(Word.Document Doc, ref bool SaveAsUI, ref bool Cancel)
{
    SaveFileDialog dgSave = new SaveFileDialog();
    dgSave.Title = "This is my save dialog";
    dgSave.FileName = "This is the initial name";
    dgSave.InitialDirectory = "C:\\Temp";
    dgSave.FileOk += dgSave_FileOk;
    DialogResult result = dgSave.ShowDialog();
}

void dgSave_FileOk(object sender, System.ComponentModel.CancelEventArgs e)
{
    var test = (SaveFileDialog)sender;
    MessageBox.Show("You clicked on SAVE and this file is selected " + test.FileName);
}

注意:通常您会使用结果然后执行操作而不是捕获FileOk事件,但听起来好像在这种情况下您想要这样做