【问题标题】:c# VSTO Outlook email body from opened windowc# VSTO Outlook 电子邮件正文来自打开的窗口
【发布时间】:2019-01-08 11:54:01
【问题描述】:

我的 Outlook VSTO 应用程序有问题。我想处理选定电子邮件中的电子邮件正文。 对于从“默认”列表中选择的电子邮件,此代码可以正常工作:

Object selItem = Globals.ThisAddIn.Application.ActiveExplorer().Selection[1];
        Outlook.MailItem mailItem = (Outlook.MailItem)selItem;
        return mailItem.Body;

但如果用户通过双击从列表中打开一封电子邮件,该电子邮件将显示在一个新窗口中。如果在此窗口中(通过功能区)执行插件,则仍然使用列表中的电子邮件(现在在后台)。

有没有办法确定插件是否在单独的窗口中启动,然后从中获取电子邮件正文?

问候, 弗洛里安

【问题讨论】:

    标签: c# outlook vsto


    【解决方案1】:

    巧合的是,我刚刚处理了类似的事情。我的情况并不相同,但是因为我可以轻松地将您正在寻找的东西拼凑在一起,请参见下文。我还没有对此进行测试,显然您必须处理将正确的引用传递给您的 Outlook 应用程序,但由于我可以立即使用它,我认为它会传递它并希望您会发现它有帮助。

            private static void ribbonButton_Click(object sender, RibbonControlEventArgs e)
        {
            Outlook.Application application = new Outlook.Application();
            Outlook.Inspector inspector = application.ActiveInspector();
    
            if (application.ActiveExplorer().Selection[1] is Outlook.MailItem explorerMailItem)
            {
                // Write code to handle message if sourced from explorer (i.e., Reading Pane)
            }
            else if (inspector.CurrentItem is Outlook.MailItem inspectorMailItem)
            {
                // Write code to hanlde message if sourced from inspector 
                // (i.e., openened (double-clicked) message
            }
        }
    

    【讨论】:

    • .Selection[1] 这个选择在 Exploer 中有什么作用?
    【解决方案2】:

    当您双击电子邮件项目时,您会打开一个检查器窗口,您可以使用Application.ActiveInspector() 方法访问它。 Inspector 对象具有 CurrentItem 属性,表示打开的项目。 此外,您应该避免在表达式中使用多个点,并正确释放 COM 对象。

    【讨论】:

    • 感谢您的快速响应!有没有办法确定插件是通过 Inspector 还是 Explorer 启动的?然后我会构建一个简单的 if 查询,它决定邮件应该来自 Inspector 还是 Explorer。
    • 使用 Application.ActiveWindow 属性 - 它将返回 Explorer 或 Inspector 对象。
    猜你喜欢
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多