繁体   English   中英

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

[英]Outlook VSTO - Adding file path/hyperlink to MailItem WordEditor from Outlook VSTO

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

工作流程是这样的:

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

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

  3. 逻辑将检查是否有ActiveInspector

    3.1. 如果有,我将其CurrentItem as MailItem (因此,新邮件对话框存在并且不需要创建)

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

  4. 接下来,我遍历选定文件路径的列表并将它们添加到新邮件对话框中。 这很好用。

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

这是代码:

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. 向您的项目添加对Microsoft.Office.Interop.Word的引用
  2. 在类文件顶部使用Microsoft.Office.Interop.Word添加

这是代码:

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.MoveDown(Word.WdUnits.wdLine);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM