【问题标题】:Accessing a Document being edited in a Outlook reading pane访问 Outlook 阅读窗格中正在编辑的文档
【发布时间】:2022-05-05 08:56:33
【问题描述】:

我编写了一个简单的 VSTO 插件,当用户单击功能区栏按钮时,它会在电子邮件中插入超链接。这是一个代码示例:

    private void button1_Click(object sender, RibbonControlEventArgs e)
    {
        var context = e.Control.Context as Inspector;

        if (context != null)
        {
            if (context.IsWordMail())
            {
                var doc = context.WordEditor as Document;
                if (doc != null)
                {
                    var sel = doc.Windows[1].Selection;
                    doc.Hyperlinks.Add(sel.Range, "http://www.google.com", "", "", "Google", "");
                }
            }
        }
        else if (e.Control.Context is Explorer)
        {
            Explorer explorer = Globals.ThisAddIn.Application.ActiveExplorer();

            if (explorer.Selection.Count == 1)
            {
                Microsoft.Office.Interop.Outlook.Selection itemSelection = explorer.Selection;
                var item = itemSelection[1] as MailItem;

                // get the instance of WordEditor in a reading pane?

            }
        }
    }

当在单独的窗口 (e.Control.Context is Inspector) 中编辑电子邮件时,这很有效。

如果正在回复/转发消息并且阅读窗格已打开,则编辑器将内嵌显示在阅读窗格中 (e.Control.Context is Explorer)。

在这种情况下,我无法弄清楚如何获取Document 的实例。我可以访问在资源管理器中选择的项目,但我不知道如何访问正在阅读窗格中显示的文档编辑器。

如果我将编辑器“弹出”到一个单独的窗口,它可以正常工作(上下文更改为 Inspector)。

有没有办法访问在阅读窗格中直接编辑的电子邮件文档?


Dmitry 的大力帮助下,他为我指明了正确的方向,我发现资源管理器类中有一个属性:Explorer.ActiveInlineResponseWordEditor,它可以让你内联显示编辑器。

【问题讨论】:

    标签: c# outlook outlook-addin


    【解决方案1】:
    1. 您可以拨打MailItem.GetInspector,然后拨打Inspector.WordEditor。这在较新版本的 Outlook 中应该可以正常工作。 Outlook 2016 还公开了 Explorer.ActiveInlineResponseWordEditor 属性。

    2. 您可以在Redemption 中使用SafeExplorer 对象(我是它的作者) - 它应该适用于所有版本的 Outlook,并且它公开了 SafeExplorer.ReadingPane 属性(ReadingPane 对象)。

    【讨论】:

    • 我尝试了第一种方法,但我得到 COMException: Out of memory。经过一番试验,我发现虽然编辑器嵌入在主窗口中,但无法进行文档操作,并且只要我“弹出”窗口,相同的代码就可以工作。例如:Document.Paragraphs[1].Range.Delete() 正在引发以下 COMException:此方法或属性不可用,因为文档被锁定以进行编辑。在单独的窗口中,它会正确删除第一段。
    • 没错,但是当我点击回复时,编辑器直接显示在阅读窗格中,并且该编辑器显然不是只读的。如果我在 MailItem.GetInspector().WordEditor 获得的文档上调用 Document.Unprotect(),则不再抛出异常,而且在尝试操作时文本也没有改变,所以它必须是显示的编辑器的不同实例在阅读(编辑?)窗格中。
    • 我还通过获取SafeExplorer.ReadingPane.WordEditor 使用您的 Redemption 库尝试了方法 2,它工作得很好,所以我猜方法 2 是我问题的答案。我希望微软首先决定在他们自己的产品中公开 ReadingPane :)。感谢您的帮助。
    • 但是您没有使用您编辑的新邮件 - 它位于草稿文件夹中。您回复的旧消息位于 Explorer.Selection 集合中,但未被编辑。如果您需要新的内联消息,则需要使用 Explorer.InlineResponse/InlineResponseClose 事件。或者您可以使用 SafeExplorer Redemption 对象 - 它使用 Windows API 来查找嵌入式文字编辑器,无论它发生什么编辑。
    • 啊,谢谢! InlineResponse 可能是我正在寻找的。查看documentation,此功能是在 Outlook 2013 中添加的,但我的项目适用于 Office 2010,因为目前我们有一个 2010/2013 版本的混合环境,我想为这两个版本提供一个插件。
    猜你喜欢
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多