2013-06-02 32 views
4

我已经编写了一个简单的VSTO插件,当用户单击一个功能区栏按钮时,将超链接插入电子邮件。下面是一个代码示例:在Outlook阅读窗格中访问正在编辑的文档

private void button1_Click(object sender, RibbonControlEventArgs e) 
    { 
     var context = e.Control.Context as Inspector; 

     if (context != null) 
     { 
      if (context.IsWordMail()) 
      { 
       var doc = context.WordEditor as Document; 
       if (doc != null) 
       { 
        var sel = doc.Windows[1].Selection; 
        doc.Hyperlinks.Add(sel.Range, "http://www.google.com", "", "", "Google", ""); 
       } 
      } 
     } 
     else if (e.Control.Context is Explorer) 
     { 
      Explorer explorer = Globals.ThisAddIn.Application.ActiveExplorer(); 

      if (explorer.Selection.Count == 1) 
      { 
       Microsoft.Office.Interop.Outlook.Selection itemSelection = explorer.Selection; 
       var item = itemSelection[1] as MailItem; 

       // get the instance of WordEditor in a reading pane? 

      } 
     } 
    } 

这种运作良好,当电子邮件是在一个单独窗口(e.Control.Context is Inspector)被编辑。

如果消息话题被回复/转发和阅读窗格被接通时,在阅读窗格(e.Control.Context is Explorer)内联显示的编辑器。

我无法弄清楚在这种情况下如何获得Document的实例。我可以访问在资源管理器中选择的项目,但我无法确定如何访问正在阅读窗格中显示的文档编辑器。

如果我'编辑'弹出'到一个单独的窗口,它工作正常(上下文更改为检查器)。

有没有方法可以访问直接在阅读窗格中编辑的电子邮件文档?


Dmitry谁指出我在正确的方向,我发现有一个资源类的属性有很大的帮助:Explorer.ActiveInlineResponseWordEditor它给你的编辑器内嵌显示。

回答

0
  1. 您可以调用MailItem.GetInspector,然后调用Inspector.WordEditor。这应该在较新版本的Outlook中正常工作。

  2. 可以在Redemption使用SafeExplorer对象 - 它应该在所有版本的Outlook工作,它暴露了SafeExplorer.ReadingPane属性(ReadingPane对象)。

+0

我试过第一种方法,但我得到COMException:内存不足。经过一番实验后,我发现当编辑器嵌入到主窗口中时,没有文件操作是可能的,并且只要我弹出窗口,相同的代码就可以工作。例如: 'Document.Paragraphs [1] .Range.Delete()'是投掷以下收到COMException:因为文档被锁定用于编辑 此方法或属性不可用。 在单独的窗口中,它正确删除第一段。 – Stefan

+0

你不期待吗?预览窗格是只读的。 –

+0

确实如此,但是当我回复时,编辑器直接显示在阅读窗格中,而且该编辑器显然不是只读的。如果我在通过MailItem.GetInspector()获取的文档上调用Document.Unprotect().WordEditor,则不会抛出异常,但是在尝试操作它时文本不会更改,因此它必须是不同的编辑器实例在阅读(编辑?)窗格中。 – Stefan