2013-06-02 58 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