C# VSTO Outlook ItemSend事件执行顺序

标签 c# outlook vsto outlook-addin

我正在使用 VSTO 在发送电子邮件时创建事件。目标是更改附件。

我已经有其他插件在 ItemSend 事件中运行,但问题是,我希望我的插件先运行。正如我所读到的,Outlook 插件发送事件没有执行顺序,但即使仅按名称或 guid 也必须有一些顺序...

我试过这个解决方案(问题是,如果我打开了 2 个邮件窗口,第一个窗口不会运行事件...:( 有一些覆盖事件问题)

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
    this.Application.Inspectors.NewInspector += new InspectorsEvents_NewInspectorEventHandler(Custom_Inspector);
    
    //This run in the end off all ItemSend Events.... :(
    //this.Application.ItemSend += new Microsoft.Office.Interop.Outlook.ApplicationEvents_11_ItemSendEventHandler(MyFunction2);
}
        
private void Custom_Inspector(Inspector Inspector)
{
    if (Inspector != null && Inspector.CurrentItem != null && Inspector.CurrentItem is Outlook.MailItem)
    {
        Outlook.MailItem mailItem = Inspector.CurrentItem as Outlook.MailItem;
                

        if (mailItem.EntryID == null)
        {
           ((ItemEvents_10_Event)mailItem).Send += new ItemEvents_10_SendEventHandler(MyFunction);
       }

    }
}
        
void MyFunction(ref bool Cancel)
{
         
    MailItem mailItemContext = ((Inspector)this.Application.ActiveWindow()).CurrentItem as MailItem;

    if (mailItemContext != null)
    {
         //my custom code here     
    }
}

最佳答案

this.Application.Inspectors.NewInspector += new InspectorsEvents_NewInspectorEventHandler(Custom_Inspector);

要触发 Inspectors 类的 NewInspector 事件,您需要使源对象保持事件状态,即防止它被垃圾收集器清除。因此,我建议在类级别的全局范围内声明 Inspectors 类的一个实例。

Outlook 对象模型不提供任何更改事件顺序的功能。根据我的经验,加载项是根据 ProgID 值(按字母顺序排序)加载的,事件以相反的顺序触发,即后进先出队列。

关于C# VSTO Outlook ItemSend事件执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32712399/

相关文章:

c# - Xamarin Forms - 根据原始源文件大小在 C# 中设置图像大小

deployment - ClickOnce VSTO解决方案已使用mage.exe签名-证书不可信错误

vsto - 将 Outlook 插件部署到 Citrix XenApp 安装

vba - 检测 Outlook/回收状态并运行多个 Outlook 实例

html - 与时事通讯文本不同颜色的下划线。(与 outlook 兼容)

.net - 可以将 DebuggerDisplay 属性应用于 Microsoft.Office.Interop.Word.Range 吗?

javascript - 在 HTML > JavaScript > WebForms 中嵌套引号或如何在 JavaScript 方法中调用 .NET 方法

c# - Google Vision API - 分析图像序列

c# - 如何使用单个文本框搜索多列)

python - 通过 MAPI 使用 Python 从 Outlook 读取电子邮件