Outlook VSTO - 从Outlook VSTO向MailItem WordEditor添加文件路径/超链接

时间:2016-08-12 17:04:34

标签: c# outlook vsto mailitem

我有以下问题。我有一个打开的窗口,允许我选择一些文件。 然后我可以右键单击该窗口并选择将所选文件的路径附加到新的邮件对话框。

工作流程如下:

  1. 我打开窗户并选择几个文件

  2. 右键单击,选择将所选文件路径添加到MailItem

  3. 逻辑将检查是否有ActiveInspector

    3.1。如果有的话,我会得到它CurrentItem as MailItem(所以,存在新邮件对话框,不需要创建)

    3.2。如果没有,我打电话给CreateItem(Microsoft.Office.Interop.OLItemType.olMailItem)来创建     新邮件对话框然后我调用MailItem.Display(false)来显示     邮件项目对话框

  4. 接下来,我遍历所选文件路径列表并将其添加到新邮件对话框中。这很有效。

  5. 问题如果我第二次打开窗口选择更多文件并将其路径添加到我之前打开的同一邮件对话框中,则不会添加它们。

    以下是代码:

    public void AddFilePaths(List<string> paths)
    {
        if (paths.Count > 0)
        {
            var inspector = MyAddIn.Application.ActiveInspector();
            MailItem mi = null;
            bool newMailItem = false;
    
            if (inspector != null)
            {
                // If new mail dialog is already open, just get it.
                // This is called on my 2nd attempt to add paths to new mail.
                // This MailItem is the same one created on 1st call in below
                // else block.  I confirmed that by adding some dummy email
                // Body in below else block, then checking for it here on 
                // 2nd call.  I think this proves that correct 
                // Inspector/MailItem is returned here.
                mi = MyAddIn.Application.ActiveInspector().CurrentItem as MailItem;
            }
            else
            {
                // create new mail dialog and display it
                // this is called on my 1st call to add paths to new mail
                mi = MyAddIn.Application.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem);
                mi.Body = "Dummy email body"; 
                newMailItem = true;
            }
    
            if (newMailItem)
            {
                mi.Display();
                inspector = MyAddIn.Application.ActiveInspector();
            }
    
            if (inspector != null)
            {
                foreach (var path in paths)
                {
                    AddPathToActiveInspector(path);
                }
            }
        }
    }
    

    上面的代码调用此方法添加当前ActiveInspector WordEditor的路径:

    public void AddPathToActiveInspector(string path)
    {
        var inspector = MyAddIn.Application.ActiveInspector();
        dynamic we = inspector.WordEditor;
        dynamic word = we.Application;
        const string nl = "\n";
    
        // I have noticed that if I am debugging, this line will throw error
        // "COMException was unhandled by user code", "An exception of type
        // System.Runtime.Interop.Services.COMException occurred in 
        // System.Dynamic.dll but was not handled by user code:
        // Message: This command is not available
        // InnerException: null
        // I have also seen following error on 2nd attempt: "The TypeText    
        // method or property is not available because the document is
        // locked for editing."
        word.Selection.TypeText(nl);
    
        string address = path;
        string subAddress = "";
        string screenTip = "";
        string displayText = path; 
        word.ActiveDocument.Hyperlinks.Add(word.Selection.Range, ref address, ref subAddress, ref screenTip, ref displayText);
        word.Selection.TypeText(" "); 
    }
    

1 个答案:

答案 0 :(得分:1)

每次添加路径时,我都会创建新的电子邮件,以避免在错误的电子邮件中添加路径,如果您打开了多封电子邮件,可能会发生这种情况。

  1. Microsoft.Office.Interop.Word的引用添加到您的项目
  2. 使用Microsoft.Office.Interop.Word在您的班级文件
  3. 上添加

    以下是代码:

    public void AddFilePaths(List<string> paths)
    {
        if (paths.Count > 0)
        {
            MailItem  mi = ThisAddIn.Application.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem);
            mi.Display();
            if (mi!= null)
            {
                foreach (var path in paths)
                {
                    AddPathsToNewEmailMessage(path);
                }
            }
        }
    }
    

    上面的代码调用此方法添加新电子邮件WordEditor的路径:

    public void AddPathsToNewEmailMessage(string path)
    {
        object link = url;
        object result = "url";
        object missing = Type.Missing;
        string nl = "\n";
    
        var inspector = ThisAddIn.Application.ActiveInspector();
        MailItem currMessage = inspector.CurrentItem;
        Word.Document doc = currMessage.GetInspector.WordEditor;
        Word.Selection sel = doc.Windows[1].Selection;
        doc.Hyperlinks.Add(sel.Range, ref result, ref missing, ref missing, ref link, ref missing);
        sel.EndKey(Word.WdUnits.wdLine);
        sel.InsertAfter(nl);
        sel.MoveDownWord.WdUnits.wdLine);
    }