1
votes

In Word, I have an open document - I navigate in the 'Save As' dialog to a directory and select an existing file. When I now click 'Save' instead of 'Cancel', I get the message if I want to overwrite/merge the existing document.

Is it possible to intercept the 'Save' event in the 'Save As' Dialog so that I can change the file name of the open document, suppressing the overwrite/merge message? Any suggestions are greatly appreciated!

2

2 Answers

2
votes

Yes, it is totally possible to intercept Word commands. In the VBA days, it was as easy as creating a macro with the same name as the internal Word command.

In VSTO, you need to add the command overwrite to your Ribbon XML and then add a callback to your code.

The entire procedure is described in MSDN: Temporarily Repurpose Commands on the Office Fluent Ribbon

Sample Ribbon XML (overwriting the standard Save command)

<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>

Ribbon Callback

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

You can replace the Office dialog by your own like this

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);
}

Note: usually you will work with the result and then doing your action rather than catching the FileOk event but it sounds like in this case you want to do that