none
请教开发word插件的思路 RRS feed

  • 问题

  • 需要给word的commandbar增加一个插件,在网上查到了如下代码,

    代码本身比较容易理解。

    但是程序运行与word的关系还不清楚。

    请问问是不是做一个c#程序,在每次运行word之前先运行这个程序,word中才会有这个菜单,才能执行按键响应代码?

     

    //Initial and show Word Application

    Word.Application wordApp = new Microsoft.Office.Interop.Word.Application();

     

    wordApp.Visible = true;

     

    //Create a Command Bar

     

    Office.CommandBar commandBar = wordApp.CommandBars.Add("My Bar",

     

    Office.MsoBarPosition.msoBarTop, false, true);

     

    commandBar.Visible = true;

     

    //Add a Command Bar button

     

    Office.CommandBarButton btn = commandBar.Controls.Add(Office.MsoControlType.msoControlButton,

     

    missing, missing, missing, true) as Office.CommandBarButton;

     

    btn.Caption = "My Button";

     

    btn.Tag = "MyButton";

     

    btn.Style = MsoButtonStyle.msoButtonCaption;

     

    btn.Click += new _CommandBarButtonEvents_ClickEventHandler(btn_Click);

     

    void btn_Click(CommandBarButton Ctrl, ref bool CancelDefault)

     

    {

     

    MessageBox.Show("My button is clicked!");

     

    }

    2011年12月4日 7:28

答案

  • 从程序看,是的;但对于 C# 的 Office 组件开发看,不是的。

    您的示例程序只是简单的创建了一个 CommandBarButton,所以,必须运行这个程序才可以动态的创建一个 CommandBarButton。注意,运行该程序后,Word 会自动启动,不需要先运行该程序后启动 Word。

    作为标准的 Office 组件开发方法,您应该安装 Microsoft Office Tools for Visual Studio,然后在 File -> New -> Project 上便可以看到 Office Add-In 的项目类型,创建该类型的项目,并利用 Designer 添加一个 CommandBarButton。运行它,Office 的对应软件就会启动。如果您部署了该项目,则下次打开 Office 后 CommandBarButton 会自动被添加。就像您安装 Office Outlook Hotmail Connector 一样,每次启动 Ooutlook 都会出现相应的工具栏。


    Mark Zhou
    • 已标记为答案 VCResearch 2011年12月10日 7:06
    2011年12月5日 9:31
  • Hi VCResearch,

    请您参考:

    HOW TO:使用 Visual C# .NET 生成 Office COM 外接程序
    http://support.microsoft.com/kb/302901

    分步示例

    1. 在 Microsoft Visual Studio .NET 的文件菜单上,单击新建,然后单击项目
    2. 新建项目对话框中,展开项目类型下的其他项目,选择扩展性项目,然后选择共享的外接程序模板。
    3. 键入 MyCOMAddin 作为该外接程序的名称,然后单击确定
    4. “扩展性向导”出现后,请按照下列步骤操作:
      1. 在第 1 页,选择使用 Visual C# 创建外接程序,然后单击下一步
      2. 在第 2 页,选择下面的宿主应用程序,然后单击下一步
        • Microsoft Word
        • Microsoft PowerPoint
        • Microsoft Outlook
        • Microsoft Excel
        • Microsoft Access
      3. 在第 3 页上,输入该外接程序的名称和描述,然后单击下一步

        注意:该外接程序的名称和描述出现在 Office 应用程序的 COM 加载项对话框中。

      4. 在第 4 页,选择所有可用的选项,然后单击下一步
      5. 单击完成
    5. 项目菜单上,单击添加引用。单击组件列表中的 System.Windows.Forms.DLL,单击选择,然后单击确定
    6. 将下列代码添加到 Connect 类中的名称空间列表中:
      using System.Reflection;
    7. 将下列成员添加到 Connect 类中:
      private CommandBarButton MyButton; 
    8. 在 Connect 类中实现 IDTExtensibility2 的成员的代码,如下所示:
      public void OnConnection(object application, Extensibility.ext_ConnectMode connectMode, object addInInst, ref System.Array custom) {
         applicationObject = application;
         addInInstance = addInInst;
      
         if(connectMode != Extensibility.ext_ConnectMode.ext_cm_Startup)
         {
            OnStartupComplete(ref custom);
         }
      
      }
      
      public void OnDisconnection(Extensibility.ext_DisconnectMode disconnectMode, ref System.Array custom) {
         if(disconnectMode != Extensibility.ext_DisconnectMode.ext_dm_HostShutdown)
         {
            OnBeginShutdown(ref custom);
         }
         applicationObject = null;
      }
      
      
      public void OnAddInsUpdate(ref System.Array custom)
      {
      }
      
      public void OnStartupComplete(ref System.Array custom)
      {
         CommandBars oCommandBars;
         CommandBar oStandardBar;
      
         try
         {
         oCommandBars = (CommandBars)applicationObject.GetType().InvokeMember("CommandBars", BindingFlags.GetProperty , null, applicationObject ,null);
         }
         catch(Exception)
         {
         // Outlook has the CommandBars collection on the Explorer object.
         object oActiveExplorer;
         oActiveExplorer= applicationObject.GetType().InvokeMember("ActiveExplorer",BindingFlags.GetProperty,null,applicationObject,null);
         oCommandBars= (CommandBars)oActiveExplorer.GetType().InvokeMember("CommandBars",BindingFlags.GetProperty,null,oActiveExplorer,null);
         }
      
         // Set up a custom button on the "Standard" commandbar.
         try
         {
         oStandardBar = oCommandBars["Standard"];        
         }
         catch(Exception)
         {
         // Access names its main toolbar Database.
         oStandardBar = oCommandBars["Database"];      
         }
      
         // In case the button was not deleted, use the exiting one.
         try
         {
         MyButton = (CommandBarButton)oStandardBar.Controls["My Custom Button"];
         }
         catch(Exception)
         {
            object omissing = System.Reflection.Missing.Value ;
            MyButton = (CommandBarButton) oStandardBar.Controls.Add(1, omissing , omissing , omissing , omissing);
            MyButton.Caption = "My Custom Button";
            MyButton.Style = MsoButtonStyle.msoButtonCaption;
         }
      
         // The following items are optional, but recommended. 
         //The Tag property lets you quickly find the control 
         //and helps MSO keep track of it when more than
         //one application window is visible. The property is required
         //by some Office applications and should be provided.
         MyButton.Tag = "My Custom Button";
      
         // The OnAction property is optional but recommended. 
         //It should be set to the ProgID of the add-in, so that if
         //the add-in is not loaded when a user presses the button,
         //MSO loads the add-in automatically and then raises
         //the Click event for the add-in to handle. 
         MyButton.OnAction = "!<MyCOMAddin.Connect>";
      
         MyButton.Visible = true;
         MyButton.Click += new Microsoft.Office.Core._CommandBarButtonEvents_ClickEventHandler(this.MyButton_Click);
      
      
         object oName = applicationObject.GetType().InvokeMember("Name",BindingFlags.GetProperty,null,applicationObject,null);
      
         // Display a simple message to show which application you started in.
         System.Windows.Forms.MessageBox.Show("This Addin is loaded by " + oName.ToString()   , "MyCOMAddin");
         oStandardBar = null;
         oCommandBars = null;
      }
      
      public void OnBeginShutdown(ref System.Array custom)
      {
         object omissing = System.Reflection.Missing.Value ;
         System.Windows.Forms.MessageBox.Show("MyCOMAddin Add-in is unloading.");
         MyButton.Delete(omissing);
         MyButton = null;
      }
      
      private void MyButton_Click(CommandBarButton cmdBarbutton,ref bool cancel) {
         System.Windows.Forms.MessageBox.Show("MyButton was Clicked","MyCOMAddin"); }
      					
    9. 生成并测试该 COM 外接程序。为此,请按照下列步骤操作:
      1. 生成菜单上,单击生成解决方案。请注意,生成 COM 外接程序的过程中实际上就向 COM interop 注册了 .NET 类。
      2. 启动一个您选作外接程序的宿主应用程序的 Office 应用程序(例如,Microsoft Word 或 Microsoft Excel)。
      3. 外接程序启动之后,将激发其 OnStartupComplete 事件,您会收到一个消息框。请关闭该消息框。请注意,外接程序向标准工具栏中添加了一个新的标题为“My Custom Button”(我的自定义按钮)的自定义按钮。
      4. 单击 My Custom Button(我的自定义按钮)。该按钮的 Click 事件将由外接程序来处理,而且您会收到一个消息框。请关闭该消息框。
      5. 退出该 Office 应用程序。
      6. 退出该应用程序时,将激发 OnBeginShutDown 事件,您会收到一个消息框。关闭该消息框以结束演示。

     

    希望对您有所帮助。

    Yoyo.


    Yoyo Jiang[MSFT]
    MSDN Community Support | Feedback to us
    • 已标记为答案 VCResearch 2011年12月10日 7:06
    2011年12月6日 9:23
    版主

全部回复

  • 从程序看,是的;但对于 C# 的 Office 组件开发看,不是的。

    您的示例程序只是简单的创建了一个 CommandBarButton,所以,必须运行这个程序才可以动态的创建一个 CommandBarButton。注意,运行该程序后,Word 会自动启动,不需要先运行该程序后启动 Word。

    作为标准的 Office 组件开发方法,您应该安装 Microsoft Office Tools for Visual Studio,然后在 File -> New -> Project 上便可以看到 Office Add-In 的项目类型,创建该类型的项目,并利用 Designer 添加一个 CommandBarButton。运行它,Office 的对应软件就会启动。如果您部署了该项目,则下次打开 Office 后 CommandBarButton 会自动被添加。就像您安装 Office Outlook Hotmail Connector 一样,每次启动 Ooutlook 都会出现相应的工具栏。


    Mark Zhou
    • 已标记为答案 VCResearch 2011年12月10日 7:06
    2011年12月5日 9:31
  • 从程序看,是的;但对于 C# 的 Office 组件开发看,不是的。

    您的示例程序只是简单的创建了一个 CommandBarButton,所以,必须运行这个程序才可以动态的创建一个 CommandBarButton。注意,运行该程序后,Word 会自动启动,不需要先运行该程序后启动 Word。

    作为标准的 Office 组件开发方法,您应该安装 Microsoft Office Tools for Visual Studio,然后在 File -> New -> Project 上便可以看到 Office Add-In 的项目类型,创建该类型的项目,并利用 Designer 添加一个 CommandBarButton。运行它,Office 的对应软件就会启动。如果您部署了该项目,则下次打开 Office 后 CommandBarButton 会自动被添加。就像您安装 Office Outlook Hotmail Connector 一样,每次启动 Ooutlook 都会出现相应的工具栏。


    Mark Zhou

    .net 4.0 3.0的项目有Office Add-In 的项目类型。

    请问如果用.net 2.0 能做 Office Add-In 的项目吗?

    2011年12月6日 8:36
  • Hi VCResearch,

    请您参考:

    HOW TO:使用 Visual C# .NET 生成 Office COM 外接程序
    http://support.microsoft.com/kb/302901

    分步示例

    1. 在 Microsoft Visual Studio .NET 的文件菜单上,单击新建,然后单击项目
    2. 新建项目对话框中,展开项目类型下的其他项目,选择扩展性项目,然后选择共享的外接程序模板。
    3. 键入 MyCOMAddin 作为该外接程序的名称,然后单击确定
    4. “扩展性向导”出现后,请按照下列步骤操作:
      1. 在第 1 页,选择使用 Visual C# 创建外接程序,然后单击下一步
      2. 在第 2 页,选择下面的宿主应用程序,然后单击下一步
        • Microsoft Word
        • Microsoft PowerPoint
        • Microsoft Outlook
        • Microsoft Excel
        • Microsoft Access
      3. 在第 3 页上,输入该外接程序的名称和描述,然后单击下一步

        注意:该外接程序的名称和描述出现在 Office 应用程序的 COM 加载项对话框中。

      4. 在第 4 页,选择所有可用的选项,然后单击下一步
      5. 单击完成
    5. 项目菜单上,单击添加引用。单击组件列表中的 System.Windows.Forms.DLL,单击选择,然后单击确定
    6. 将下列代码添加到 Connect 类中的名称空间列表中:
      using System.Reflection;
    7. 将下列成员添加到 Connect 类中:
      private CommandBarButton MyButton; 
    8. 在 Connect 类中实现 IDTExtensibility2 的成员的代码,如下所示:
      public void OnConnection(object application, Extensibility.ext_ConnectMode connectMode, object addInInst, ref System.Array custom) {
         applicationObject = application;
         addInInstance = addInInst;
      
         if(connectMode != Extensibility.ext_ConnectMode.ext_cm_Startup)
         {
            OnStartupComplete(ref custom);
         }
      
      }
      
      public void OnDisconnection(Extensibility.ext_DisconnectMode disconnectMode, ref System.Array custom) {
         if(disconnectMode != Extensibility.ext_DisconnectMode.ext_dm_HostShutdown)
         {
            OnBeginShutdown(ref custom);
         }
         applicationObject = null;
      }
      
      
      public void OnAddInsUpdate(ref System.Array custom)
      {
      }
      
      public void OnStartupComplete(ref System.Array custom)
      {
         CommandBars oCommandBars;
         CommandBar oStandardBar;
      
         try
         {
         oCommandBars = (CommandBars)applicationObject.GetType().InvokeMember("CommandBars", BindingFlags.GetProperty , null, applicationObject ,null);
         }
         catch(Exception)
         {
         // Outlook has the CommandBars collection on the Explorer object.
         object oActiveExplorer;
         oActiveExplorer= applicationObject.GetType().InvokeMember("ActiveExplorer",BindingFlags.GetProperty,null,applicationObject,null);
         oCommandBars= (CommandBars)oActiveExplorer.GetType().InvokeMember("CommandBars",BindingFlags.GetProperty,null,oActiveExplorer,null);
         }
      
         // Set up a custom button on the "Standard" commandbar.
         try
         {
         oStandardBar = oCommandBars["Standard"];        
         }
         catch(Exception)
         {
         // Access names its main toolbar Database.
         oStandardBar = oCommandBars["Database"];      
         }
      
         // In case the button was not deleted, use the exiting one.
         try
         {
         MyButton = (CommandBarButton)oStandardBar.Controls["My Custom Button"];
         }
         catch(Exception)
         {
            object omissing = System.Reflection.Missing.Value ;
            MyButton = (CommandBarButton) oStandardBar.Controls.Add(1, omissing , omissing , omissing , omissing);
            MyButton.Caption = "My Custom Button";
            MyButton.Style = MsoButtonStyle.msoButtonCaption;
         }
      
         // The following items are optional, but recommended. 
         //The Tag property lets you quickly find the control 
         //and helps MSO keep track of it when more than
         //one application window is visible. The property is required
         //by some Office applications and should be provided.
         MyButton.Tag = "My Custom Button";
      
         // The OnAction property is optional but recommended. 
         //It should be set to the ProgID of the add-in, so that if
         //the add-in is not loaded when a user presses the button,
         //MSO loads the add-in automatically and then raises
         //the Click event for the add-in to handle. 
         MyButton.OnAction = "!<MyCOMAddin.Connect>";
      
         MyButton.Visible = true;
         MyButton.Click += new Microsoft.Office.Core._CommandBarButtonEvents_ClickEventHandler(this.MyButton_Click);
      
      
         object oName = applicationObject.GetType().InvokeMember("Name",BindingFlags.GetProperty,null,applicationObject,null);
      
         // Display a simple message to show which application you started in.
         System.Windows.Forms.MessageBox.Show("This Addin is loaded by " + oName.ToString()   , "MyCOMAddin");
         oStandardBar = null;
         oCommandBars = null;
      }
      
      public void OnBeginShutdown(ref System.Array custom)
      {
         object omissing = System.Reflection.Missing.Value ;
         System.Windows.Forms.MessageBox.Show("MyCOMAddin Add-in is unloading.");
         MyButton.Delete(omissing);
         MyButton = null;
      }
      
      private void MyButton_Click(CommandBarButton cmdBarbutton,ref bool cancel) {
         System.Windows.Forms.MessageBox.Show("MyButton was Clicked","MyCOMAddin"); }
      					
    9. 生成并测试该 COM 外接程序。为此,请按照下列步骤操作:
      1. 生成菜单上,单击生成解决方案。请注意,生成 COM 外接程序的过程中实际上就向 COM interop 注册了 .NET 类。
      2. 启动一个您选作外接程序的宿主应用程序的 Office 应用程序(例如,Microsoft Word 或 Microsoft Excel)。
      3. 外接程序启动之后,将激发其 OnStartupComplete 事件,您会收到一个消息框。请关闭该消息框。请注意,外接程序向标准工具栏中添加了一个新的标题为“My Custom Button”(我的自定义按钮)的自定义按钮。
      4. 单击 My Custom Button(我的自定义按钮)。该按钮的 Click 事件将由外接程序来处理,而且您会收到一个消息框。请关闭该消息框。
      5. 退出该 Office 应用程序。
      6. 退出该应用程序时,将激发 OnBeginShutDown 事件,您会收到一个消息框。关闭该消息框以结束演示。

     

    希望对您有所帮助。

    Yoyo.


    Yoyo Jiang[MSFT]
    MSDN Community Support | Feedback to us
    • 已标记为答案 VCResearch 2011年12月10日 7:06
    2011年12月6日 9:23
    版主
  • Hi VCResearch,

    请您参考:

    HOW TO:使用 Visual C# .NET 生成 Office COM 外接程序
    http://support.microsoft.com/kb/302901

     

    分步示例

    1. 在 Microsoft Visual Studio .NET 的文件菜单上,单击新建,然后单击项目
    2. 新建项目对话框中,展开项目类型下的其他项目,选择扩展性项目,然后选择共享的外接程序模板。
    3. 键入 MyCOMAddin 作为该外接程序的名称,然后单击确定
    4. “扩展性向导”出现后,请按照下列步骤操作:
      1. 在第 1 页,选择使用 Visual C# 创建外接程序,然后单击下一步
      2. 在第 2 页,选择下面的宿主应用程序,然后单击下一步
        • Microsoft Word
        • Microsoft PowerPoint
        • Microsoft Outlook
        • Microsoft Excel
        • Microsoft Access
      3. 在第 3 页上,输入该外接程序的名称和描述,然后单击下一步

        注意:该外接程序的名称和描述出现在 Office 应用程序的 COM 加载项对话框中。

      4. 在第 4 页,选择所有可用的选项,然后单击下一步
      5. 单击完成
    5. 项目菜单上,单击添加引用。单击组件列表中的 System.Windows.Forms.DLL,单击选择,然后单击确定
    6. 将下列代码添加到 Connect 类中的名称空间列表中:
      using System.Reflection;
    7. 将下列成员添加到 Connect 类中:
      private CommandBarButton MyButton; 
    8. 在 Connect 类中实现 IDTExtensibility2 的成员的代码,如下所示:
      public void OnConnection(object application, Extensibility.ext_ConnectMode connectMode, object addInInst, ref System.Array custom) {
         applicationObject = application;
         addInInstance = addInInst;
      
         if(connectMode != Extensibility.ext_ConnectMode.ext_cm_Startup)
         {
            OnStartupComplete(ref custom);
         }
      
      }
      
      public void OnDisconnection(Extensibility.ext_DisconnectMode disconnectMode, ref System.Array custom) {
         if(disconnectMode != Extensibility.ext_DisconnectMode.ext_dm_HostShutdown)
         {
            OnBeginShutdown(ref custom);
         }
         applicationObject = null;
      }
      
      
      public void OnAddInsUpdate(ref System.Array custom)
      {
      }
      
      public void OnStartupComplete(ref System.Array custom)
      {
         CommandBars oCommandBars;
         CommandBar oStandardBar;
      
         try
         {
         oCommandBars = (CommandBars)applicationObject.GetType().InvokeMember("CommandBars", BindingFlags.GetProperty , null, applicationObject ,null);
         }
         catch(Exception)
         {
         // Outlook has the CommandBars collection on the Explorer object.
         object oActiveExplorer;
         oActiveExplorer= applicationObject.GetType().InvokeMember("ActiveExplorer",BindingFlags.GetProperty,null,applicationObject,null);
         oCommandBars= (CommandBars)oActiveExplorer.GetType().InvokeMember("CommandBars",BindingFlags.GetProperty,null,oActiveExplorer,null);
         }
      
         // Set up a custom button on the "Standard" commandbar.
         try
         {
         oStandardBar = oCommandBars["Standard"];        
         }
         catch(Exception)
         {
         // Access names its main toolbar Database.
         oStandardBar = oCommandBars["Database"];      
         }
      
         // In case the button was not deleted, use the exiting one.
         try
         {
         MyButton = (CommandBarButton)oStandardBar.Controls["My Custom Button"];
         }
         catch(Exception)
         {
            object omissing = System.Reflection.Missing.Value ;
            MyButton = (CommandBarButton) oStandardBar.Controls.Add(1, omissing , omissing , omissing , omissing);
            MyButton.Caption = "My Custom Button";
            MyButton.Style = MsoButtonStyle.msoButtonCaption;
         }
      
         // The following items are optional, but recommended. 
         //The Tag property lets you quickly find the control 
         //and helps MSO keep track of it when more than
         //one application window is visible. The property is required
         //by some Office applications and should be provided.
         MyButton.Tag = "My Custom Button";
      
         // The OnAction property is optional but recommended. 
         //It should be set to the ProgID of the add-in, so that if
         //the add-in is not loaded when a user presses the button,
         //MSO loads the add-in automatically and then raises
         //the Click event for the add-in to handle. 
         MyButton.OnAction = "!<MyCOMAddin.Connect>";
      
         MyButton.Visible = true;
         MyButton.Click += new Microsoft.Office.Core._CommandBarButtonEvents_ClickEventHandler(this.MyButton_Click);
      
      
         object oName = applicationObject.GetType().InvokeMember("Name",BindingFlags.GetProperty,null,applicationObject,null);
      
         // Display a simple message to show which application you started in.
         System.Windows.Forms.MessageBox.Show("This Addin is loaded by " + oName.ToString()   , "MyCOMAddin");
         oStandardBar = null;
         oCommandBars = null;
      }
      
      public void OnBeginShutdown(ref System.Array custom)
      {
         object omissing = System.Reflection.Missing.Value ;
         System.Windows.Forms.MessageBox.Show("MyCOMAddin Add-in is unloading.");
         MyButton.Delete(omissing);
         MyButton = null;
      }
      
      private void MyButton_Click(CommandBarButton cmdBarbutton,ref bool cancel) {
         System.Windows.Forms.MessageBox.Show("MyButton was Clicked","MyCOMAddin"); }
      					
    9. 生成并测试该 COM 外接程序。为此,请按照下列步骤操作:
      1. 生成菜单上,单击生成解决方案。请注意,生成 COM 外接程序的过程中实际上就向 COM interop 注册了 .NET 类。
      2. 启动一个您选作外接程序的宿主应用程序的 Office 应用程序(例如,Microsoft Word 或 Microsoft Excel)。
      3. 外接程序启动之后,将激发其 OnStartupComplete 事件,您会收到一个消息框。请关闭该消息框。请注意,外接程序向标准工具栏中添加了一个新的标题为“My Custom Button”(我的自定义按钮)的自定义按钮。
      4. 单击 My Custom Button(我的自定义按钮)。该按钮的 Click 事件将由外接程序来处理,而且您会收到一个消息框。请关闭该消息框。
      5. 退出该 Office 应用程序。
      6. 退出该应用程序时,将激发 OnBeginShutDown 事件,您会收到一个消息框。关闭该消息框以结束演示。

     

     

    希望对您有所帮助。

    Yoyo.


    Yoyo Jiang[MSFT]
    MSDN Community Support | Feedback to us

    谢谢,正在试,可能还有有不懂的需请教。
    2011年12月7日 4:01
  • 不客气。

    如果您有任何问题,也可以考虑在论坛发起新帖。

    另外,关于Office的问题,您可以考虑下面的英文论坛:

    Microsoft Office for Developers Forums

    http://social.msdn.microsoft.com/Forums/en-US/category/officedev

    谢谢您的理解!

    祝,今天愉快!

    Yoyo.

     


    Yoyo Jiang[MSFT]
    MSDN Community Support | Feedback to us
    2011年12月7日 5:01
    版主
  • Hi VCResearch,

    请您参考:

    HOW TO:使用 Visual C# .NET 生成 Office COM 外接程序
    http://support.microsoft.com/kb/302901

     

    分步示例

    1. 在 Microsoft Visual Studio .NET 的文件菜单上,单击新建,然后单击项目
    2. 新建项目对话框中,展开项目类型下的其他项目,选择扩展性项目,然后选择共享的外接程序模板。
    3. 键入 MyCOMAddin 作为该外接程序的名称,然后单击确定
    4. “扩展性向导”出现后,请按照下列步骤操作:
      1. 在第 1 页,选择使用 Visual C# 创建外接程序,然后单击下一步
      2. 在第 2 页,选择下面的宿主应用程序,然后单击下一步
        • Microsoft Word
        • Microsoft PowerPoint
        • Microsoft Outlook
        • Microsoft Excel
        • Microsoft Access
      3. 在第 3 页上,输入该外接程序的名称和描述,然后单击下一步

        注意:该外接程序的名称和描述出现在 Office 应用程序的 COM 加载项对话框中。

      4. 在第 4 页,选择所有可用的选项,然后单击下一步
      5. 单击完成
    5. 项目菜单上,单击添加引用。单击组件列表中的 System.Windows.Forms.DLL,单击选择,然后单击确定
    6. 将下列代码添加到 Connect 类中的名称空间列表中:
      using System.Reflection;
    7. 将下列成员添加到 Connect 类中:
      private CommandBarButton MyButton; 
    8. 在 Connect 类中实现 IDTExtensibility2 的成员的代码,如下所示:
      public void OnConnection(object application, Extensibility.ext_ConnectMode connectMode, object addInInst, ref System.Array custom) {
         applicationObject = application;
         addInInstance = addInInst;
      
         if(connectMode != Extensibility.ext_ConnectMode.ext_cm_Startup)
         {
            OnStartupComplete(ref custom);
         }
      
      }
      
      public void OnDisconnection(Extensibility.ext_DisconnectMode disconnectMode, ref System.Array custom) {
         if(disconnectMode != Extensibility.ext_DisconnectMode.ext_dm_HostShutdown)
         {
            OnBeginShutdown(ref custom);
         }
         applicationObject = null;
      }
      
      
      public void OnAddInsUpdate(ref System.Array custom)
      {
      }
      
      public void OnStartupComplete(ref System.Array custom)
      {
         CommandBars oCommandBars;
         CommandBar oStandardBar;
      
         try
         {
         oCommandBars = (CommandBars)applicationObject.GetType().InvokeMember("CommandBars", BindingFlags.GetProperty , null, applicationObject ,null);
         }
         catch(Exception)
         {
         // Outlook has the CommandBars collection on the Explorer object.
         object oActiveExplorer;
         oActiveExplorer= applicationObject.GetType().InvokeMember("ActiveExplorer",BindingFlags.GetProperty,null,applicationObject,null);
         oCommandBars= (CommandBars)oActiveExplorer.GetType().InvokeMember("CommandBars",BindingFlags.GetProperty,null,oActiveExplorer,null);
         }
      
         // Set up a custom button on the "Standard" commandbar.
         try
         {
         oStandardBar = oCommandBars["Standard"];        
         }
         catch(Exception)
         {
         // Access names its main toolbar Database.
         oStandardBar = oCommandBars["Database"];      
         }
      
         // In case the button was not deleted, use the exiting one.
         try
         {
         MyButton = (CommandBarButton)oStandardBar.Controls["My Custom Button"];
         }
         catch(Exception)
         {
            object omissing = System.Reflection.Missing.Value ;
            MyButton = (CommandBarButton) oStandardBar.Controls.Add(1, omissing , omissing , omissing , omissing);
            MyButton.Caption = "My Custom Button";
            MyButton.Style = MsoButtonStyle.msoButtonCaption;
         }
      
         // The following items are optional, but recommended. 
         //The Tag property lets you quickly find the control 
         //and helps MSO keep track of it when more than
         //one application window is visible. The property is required
         //by some Office applications and should be provided.
         MyButton.Tag = "My Custom Button";
      
         // The OnAction property is optional but recommended. 
         //It should be set to the ProgID of the add-in, so that if
         //the add-in is not loaded when a user presses the button,
         //MSO loads the add-in automatically and then raises
         //the Click event for the add-in to handle. 
         MyButton.OnAction = "!<MyCOMAddin.Connect>";
      
         MyButton.Visible = true;
         MyButton.Click += new Microsoft.Office.Core._CommandBarButtonEvents_ClickEventHandler(this.MyButton_Click);
      
      
         object oName = applicationObject.GetType().InvokeMember("Name",BindingFlags.GetProperty,null,applicationObject,null);
      
         // Display a simple message to show which application you started in.
         System.Windows.Forms.MessageBox.Show("This Addin is loaded by " + oName.ToString()   , "MyCOMAddin");
         oStandardBar = null;
         oCommandBars = null;
      }
      
      public void OnBeginShutdown(ref System.Array custom)
      {
         object omissing = System.Reflection.Missing.Value ;
         System.Windows.Forms.MessageBox.Show("MyCOMAddin Add-in is unloading.");
         MyButton.Delete(omissing);
         MyButton = null;
      }
      
      private void MyButton_Click(CommandBarButton cmdBarbutton,ref bool cancel) {
         System.Windows.Forms.MessageBox.Show("MyButton was Clicked","MyCOMAddin"); }
      					
    9. 生成并测试该 COM 外接程序。为此,请按照下列步骤操作:
      1. 生成菜单上,单击生成解决方案。请注意,生成 COM 外接程序的过程中实际上就向 COM interop 注册了 .NET 类。
      2. 启动一个您选作外接程序的宿主应用程序的 Office 应用程序(例如,Microsoft Word 或 Microsoft Excel)。
      3. 外接程序启动之后,将激发其 OnStartupComplete 事件,您会收到一个消息框。请关闭该消息框。请注意,外接程序向标准工具栏中添加了一个新的标题为“My Custom Button”(我的自定义按钮)的自定义按钮。
      4. 单击 My Custom Button(我的自定义按钮)。该按钮的 Click 事件将由外接程序来处理,而且您会收到一个消息框。请关闭该消息框。
      5. 退出该 Office 应用程序。
      6. 退出该应用程序时,将激发 OnBeginShutDown 事件,您会收到一个消息框。关闭该消息框以结束演示。

     

     

    希望对您有所帮助。

    Yoyo.


    Yoyo Jiang[MSFT]
    MSDN Community Support | Feedback to us

    谢谢。
    2011年12月10日 7:06
  • 从程序看,是的;但对于 C# 的 Office 组件开发看,不是的。

    您的示例程序只是简单的创建了一个 CommandBarButton,所以,必须运行这个程序才可以动态的创建一个 CommandBarButton。注意,运行该程序后,Word 会自动启动,不需要先运行该程序后启动 Word。

    作为标准的 Office 组件开发方法,您应该安装 Microsoft Office Tools for Visual Studio,然后在 File -> New -> Project 上便可以看到 Office Add-In 的项目类型,创建该类型的项目,并利用 Designer 添加一个 CommandBarButton。运行它,Office 的对应软件就会启动。如果您部署了该项目,则下次打开 Office 后 CommandBarButton 会自动被添加。就像您安装 Office Outlook Hotmail Connector 一样,每次启动 Ooutlook 都会出现相应的工具栏。


    Mark Zhou

    谢谢。
    2011年12月10日 7:06