0

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

工作流程是这样的:

  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(" "); 
}
4

1 回答 1

1

每次您添加路径时,我都会简单地创建一个新的电子邮件消息,以避免向错误的电子邮件消息添加路径的可能性,如果您打开了多封电子邮件,可能会发生这种情况。

  1. 添加对Microsoft.Office.Interop.Word项目的引用
  2. Microsoft.Office.Interop.Word在你的类文件上添加 using

这是代码:

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);
}
于 2016-08-18T23:32:57.233 回答