【问题标题】:C# VSTO Outlook Outgoing Message HyperlinkC# VSTO Outlook 外发邮件超链接
【发布时间】:2015-08-06 22:25:14
【问题描述】:

我正在为 Outlook 2010 创建一个 C# VSTO 加载项。我正在尝试在正在处理的活动传出消息的插入点生成一个超链接(超链接是通过消息窗口功能区上的按钮插入的)。插件的所有其他功能(功能区按钮、访问ActiveInspector().CurrentItem 等)都可以正常工作。我正在使用此代码:

object linktext = txtDisplayText.Text;
object result = "MY URL";
object missObj = Type.Missing;

Outlook.MailItem currentMessage = 
     Globals.ThisAddIn.Application.ActiveInspector().CurrentItem;
Word.Document doc = currentMessage.GetInspector.WordEditor;
object oRange = doc.Windows[1].Selection;
doc.Application.Selection.Hyperlinks.Add
    (oRange, ref result, ref missObj, ref missObj, ref linktext, ref missObj);

当我运行此代码时,我收到消息“命令失败”。我怀疑我遗漏了一些关于 Outlook 如何使用 Microsoft Word 的 Outlook 消息编辑器的内容,或者我在 oRange 中指定选择对象的方式。非常感谢任何帮助。

【问题讨论】:

    标签: c# outlook vsto outlook-addin office-addins


    【解决方案1】:

    这个问题确实是由为Hyperlinks.Add 命令定义选择的方式引起的。选择需要键入 Microsoft Word 选择而不是对象类型(因为 Outlook 使用 Word 作为其编辑器):

    Word.Selection objSel = doc.Windows[1].Selection;
    

    因此,要在撰写过程中在 Outlook 邮件的插入点插入超链接,代码对 Word 和 Outlook 都有 using 语句:

    using Outlook = Microsoft.Office.Interop.Outlook;
    using Word = Microsoft.Office.Interop.Word;
    

    然后是这段代码:

    object linktext = txtDisplayText.Text;
    object result = "MY URL";
    object missObj = Type.Missing;
    
    Outlook.MailItem currentMessage = 
         Globals.ThisAddIn.Application.ActiveInspector().CurrentItem;
    Word.Document doc = currentMessage.GetInspector.WordEditor;
    Word.Selection objSel = doc.Windows[1].Selection;
    doc.Hyperlinks.Add
         (objSel.Range, ref result, ref missObj, ref missObj, ref linktext, ref missObj);
    

    还有两个值得注意的调整。因为Word.Selection 类型用于超链接的锚点,所以需要将Hyperlinks.Add 命令从doc.Application.Selection.Hyperlinks.Add 更改为doc.Hyperlinks.Add。由于 Outlook 使用 Microsoft 的 Word 编辑器,doc.Hyperlinks.Add 的锚点使用了一个范围:objSel.Range

    【讨论】:

    • 嗨,乔,感谢您发布答案。它实际上对我帮助很大。但是一件小事。如果你要在超链接中添加一个新行,你会怎么做?我在循环中调用您的代码以添加多个超链接,但将 System.Environment.NewLine 添加到我的链接文本会导致在我的下一个链接之前的新行上显示一个有线图标。非常感谢!
    • @dbnex14 我认为您想将新行添加到包含链接的范围对象中。试试objSel.Range.Text = @"\r\n";这里是附加信息:How to Programmatically Insert Text into Word Documents
    • 谢谢,但这只是添加字符串“\r\n”。我也尝试设置为 "\n" 或 objSel.Range.Text = System.Environment.NewLine 但这也不会添加新行。非常感谢乔!
    • @dbnex14 我误会了吗?您不想输出一个超链接,然后是换行符,然后是另一个链接等吗?我看到你在这里发布了这个问题:Outlook VSTO - Add new line to WordEditor Document Hyperlink。如果我有时间今晚我会玩代码,并在你发布这个问题的地方继续这个对话(上面链接)。
    • @dbnex14 我在您的 SO 问题出现的地方发布了我的答案。抱歉在我上面的评论中输入@"\r\n"。是一个错字,不应该有“@”符号(这使得反斜杠成为文字字符串字符,而不是开始转义序列)。无论如何,请完全忽略评论,因为我现在了解发生了什么,并详细说明了我认为您的 SO 问题的正确答案。干杯。
    【解决方案2】:

    使用 MailItem 类的 HTMLBody 属性来修改 ItemSend 事件处理程序中的消息正文(插入超链接)。您需要找到粘贴超链接<a href=.../> 的位置,修改HTML 格式正确的字符串并将其分配回去。

    【讨论】:

    • Eugene,ItemSend 事件处理程序在用户发送消息后截获消息。我正在使用我放置在消息功能区中的自定义功能区按钮,以便用户插入超链接,然后继续处理消息。 HTMLBody 属性替换了整个 Outlook 邮件,但我希望在邮件文本的插入点插入文本(键入时会看到文本出现的位置)。我目前认为我需要以某种方式更改范围以阻止 Hyperlinks.Add 失败。
    • 您需要在现有的 HTML 标记中插入一个超链接,然后将其重新设置。 HTMLBody 属性不会替换整个 Outlook 邮件。你试过什么代码?
    • 尤金,HTMLBody 不是答案。请参阅我上面的代码。谢谢。
    • HTMLBody 是完成工作的另一种方式。
    • Eugene,如果您想发布代码以使 HTMLBody 在外发 Outlook 邮件的插入点添加超链接(并将插入点返回到用户之前的可编辑点)创建超链接后)我认为我自己和其他人都会从中受益。
    猜你喜欢
    • 1970-01-01
    • 2016-12-19
    • 2023-02-01
    • 2017-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 2017-08-16
    相关资源
    最近更新 更多