Outlook VSTO - 在选择时调用 TypeText 引发 "This command is not available" 异常

Outlook VSTO - Calling TypeText on Selection throws "This command is not available" Exception

Selection 上调用 TypeText 会引发 "This command is not available." 异常

下面是我的代码

public void AddFilePaths(List<string> urls)
{
    if (urls.Count > 0)
    {
        MailItem mi = null;
        bool newMailItem = false;

        mi = MyAddIn.Application.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem);
        mi.Body = "New email body"; 
        newMailItem = true;

        mi.Display();
        inspector = MyAddIn.Application.ActiveInspector();

        if (mi != null)
        {
            foreach (var url in urls)
            {
                AddPathToActiveInspector(urls);
            }
        }
    }
}

public void AddLinkToCurrentInspector(string url)
{
    var inspector = MyAddIn.Application.ActiveInspector();
    var currMessage = inspector.CurrentItem;
    Microsoft.Office.Interop.Word.Document word = currMessage.GetInspector.WordEditor; 
    dynamic wordapp = word.Application;
    const string text = "\n"; // thisfor some reason will not add new line
    Microsoft.Office.Interop.Word.Selection sel = word.Windows[1].Selection;
    sel.TypeText(text); // this often errors
    string address = url;
    string subAddress = "";
    string screenTip = "";
    string textToDisplay = url; 
    wordapp.ActiveDocument.Hyperlinks.Add(sel.Range, ref address, ref subAddress, ref screenTip, ref textToDisplay);
    if (word.ProtectionType != Microsoft.Office.Interop.Word.WdProtectionType.wdNoProtection) word.Unprotect(); 
    sel.TypeText(" "); 
}

您不需要调用 TypeText - 只需设置文本 属性:

Application.ActiveInspector.WordEditor.Application.Selection.Text = "test"

根据这个问题的回答,我也解决了这个问题。比上面的代码效果更好并且更容易理解的代码如下。非常感谢@joeshwa:

    public void AddLinkToCurrentInspector(string url)
    {
        object link = url;
        object result = "url";
        object missing = Type.Missing;

        var inspector = MyAddIn.Application.ActiveInspector();
        MailItem currMessage = inspector.CurrentItem;
        Microsoft.Office.Interop.Word.Document doc = currMessage.GetInspector.WordEditor;
        Microsoft.Office.Interop.Word.Selection sel = doc.Windows[1].Selection;
        doc.Hyperlinks.Add(sel.Range, ref result, ref missing, ref missing, ref link, ref missing);
        sel.EndKey(Microsoft.Office.Interop.Word.WdUnits.wdLine);
        sel.InsertAfter("\n");
        sel.MoveDown(Microsoft.Office.Interop.Word.WdUnits.wdLine);
    }