c# VSTO Outlook ItemSend事件执行顺序

本文关键字:执行 顺序 事件 ItemSend VSTO Outlook | 更新日期: 2023-09-27 18:13:50

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

我已经有其他插件在ItemSend事件中运行,但问题是,我希望我的插件先运行。正如我所读到的,Outlook addins sent事件没有执行顺序,但必须有一些顺序,即使只是通过名称或guid…

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

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     
    }
}

c# VSTO Outlook ItemSend事件执行顺序

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

要让督察类的NewInspector事件被触发,你需要保持源对象是活的,即防止它被垃圾收集器扫过。因此,我建议在全局作用域(类级别)声明inspector类的实例。

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

Eugene 100000谢谢!在现实中Outlook订单插件事件按字母顺序颠倒。但是顺便问一下,NewInspector是如何成为顶级的呢?我需要在类ThisAddIn中定义一个prop调用:

   public partial class ThisAddIn
{
        public Microsoft.Office.Interop.Outlook.Inspectors _inspector;
        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
            _inspector = this.Application.Inspectors;
            _inspector.NewInspector += new InspectorsEvents_NewInspectorEventHandler(Custom_Inspector);
        }
}