C# - 如何在 outlook [com-addin] 中查找哪个 mailItem 用户正在关闭

C# - How to find which mailItem user is closing in outlook [com-addin]

我目前正在尝试对 mailItem 关闭执行一些操作。 Microsoft ItemEvents_10_Event.Close 事件不提供关闭哪个 mailItem。

如果用户打开了多封电子邮件并关闭了其中一封,我如何才能知道选择了关闭哪个电子邮件项目?是否有任何 属性 表明此邮件项目正在关闭?

//New inspector event:
m_inspectors.NewInspector += m_inspectors_NewInspector;

//Trigerring mailItem close event from the new inspector.
 void m_inspectors_NewInspector(Interop.Inspector Inspector)
        {
            Interop.MailItem me = null;            
            try
            {
                me = Inspector.CurrentItem as Interop.MailItem;                
                if (me != null)
                {
                    ((Interop.ItemEvents_10_Event)me).Close += OutlookApp_Close;
                    //some operations.
                }
            }
            catch
            {
               
            }
            finally
            {
                if (me != null)
                {
                    me.ReleaseComObject();
                    me = null;
                }
            }
        }
//mailItem close event
 private void OutlookApp_Close(ref bool Cancel)
        {
           //here I need to get the exact mailItem that is about to close.
        }`

基本上,是否有可能在任何关闭事件中获得准确的 mailItem?

创建一个包装器 class,将 MailItem 作为其构造函数的参数并将其保存在成员变量中。使事件处理程序成为 class 上的方法。当它触发时,您将拥有引用 MailItem 对象的成员变量。

    MailItemWrapper wrapper = new MailItemWrapper(me);
    ...
    public class MailItemWrapper
    {
      private MailItem _mailItem;
      public MailItemWrapper(MailItem mailItem)
      {
        _mailItem = mailItem;
        ((Interop.ItemEvents_10_Event)_mailItem).Close += On_Close; 
      }
      private void On_Close(ref bool Cancel)
      {
        MessageBox.Show(_mailItem.Subject);
        Marshal.ReleaseComObject(_mailItem);
        _mailItem = null;
        //todo: if the wrapper is stored in a list, remove self from that list
      }
    }