【问题标题】:Disappearing Reply, Reply-All, and Forward event handlers in Outlook add-in?Outlook 加载项中的回复、全部回复和转发事件处理程序消失?
【发布时间】:2020-07-12 18:44:05
【问题描述】:

当激活回复/全部回复/转发窗口时,我正在尝试从 Outlook 2007 VSTO 加载项捕获事件。所以我这样做:

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
    this.Application.ItemLoad += new Microsoft.Office.Interop.Outlook.ApplicationEvents_11_ItemLoadEventHandler(onItemLoad);
}

Outlook.ItemEvents_10_Event gObj_itemEvt = null;

private void onItemLoad(object Item)
{
    gObj_itemEvt = (Outlook.ItemEvents_10_Event)Item;

    gObj_itemEvt.Reply += new Microsoft.Office.Interop.Outlook.ItemEvents_10_ReplyEventHandler(on_Reply);
    gObj_itemEvt.ReplyAll += new Microsoft.Office.Interop.Outlook.ItemEvents_10_ReplyAllEventHandler(on_ReplyAll);
    gObj_itemEvt.Forward += new Microsoft.Office.Interop.Outlook.ItemEvents_10_ForwardEventHandler(on_Forward);
}

private void on_Reply(object Item, ref bool cancel)
{
    //Called when user loads Reply window
    LogMessage("Reply opened");
}

private void on_ReplyAll(object Item, ref bool cancel)
{
    //Called when user loads Reply-All window
    LogMessage("Reply-All opened");
}

private void on_Forward(object Item, ref bool cancel)
{
    //Called when user loads Forward window
    LogMessage("Forward opened");
}

这工作了几次,但随后停止。在这种情况下,我仍然会收到 onItemLoad 事件,但 on_Replyon_ReplyAllon_Forward 不再广播。

我在这里做错了什么?

【问题讨论】:

    标签: c# vsto outlook-addin office-addins


    【解决方案1】:

    您将单个对象定义为ReplyReplyAllForward 等事件的源。这意味着只能打开一个项目来处理这些事件。让我们想象以下场景,当打开两个项目并触发 ItemLoad 事件时。在第一个项目的情况下,一切顺利,源项目设置正确。但是第二个事件会导致重写源项目,因此您将不再持有对第一个项目的引用,也不会获得它的事件。如果您想处理所有打开的 Outlook 项目的事件,您需要维护一个对象列表而不是单个对象引用:

    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        this.Application.ItemLoad += new Microsoft.Office.Interop.Outlook.ApplicationEvents_11_ItemLoadEventHandler(onItemLoad);
    }
    
    List<Outlook.ItemEvents_10_Event> gObj_itemEvtList = new List<Outlook.ItemEvents_10_Event>();
    
    private void onItemLoad(object Item)
    {
        ItemEvents_10_Event gObj_itemEvt = (Outlook.ItemEvents_10_Event)Item;
    
        gObj_itemEvt.Reply += new Microsoft.Office.Interop.Outlook.ItemEvents_10_ReplyEventHandler(on_Reply);
        gObj_itemEvt.ReplyAll += new Microsoft.Office.Interop.Outlook.ItemEvents_10_ReplyAllEventHandler(on_ReplyAll);
        gObj_itemEvt.Forward += new Microsoft.Office.Interop.Outlook.ItemEvents_10_ForwardEventHandler(on_Forward);
    
       gObj_itemEvtList.Add(gObj_itemEvt);
    }
    
    private void on_Reply(object Item, ref bool cancel)
    {
        //Called when user loads Reply window
        LogMessage("Reply opened");
    }
    
    private void on_ReplyAll(object Item, ref bool cancel)
    {
        //Called when user loads Reply-All window
        LogMessage("Reply-All opened");
    }
    
    private void on_Forward(object Item, ref bool cancel)
    {
        //Called when user loads Forward window
        LogMessage("Forward opened");
    }
    

    【讨论】:

    • 谢谢。我需要尝试一下。不过有一个问题——如果我继续在一个列表中收集所有这些对象,我不会有内存泄漏吗?换句话说,我是否需要在某个时候释放/删除它们?
    • 您可以订阅 Unload 等事件,以便在需要的地方和时间删除对象。
    • 它适用于收集列表中的所有内容。但是为了修复内存泄漏,我怎么知道在 Unload 方法中正在卸载哪个对象,以便我可以从 gObj_itemEvtList 中删除它?
    • 要区分项目及其事件,您可以开发一个检查器包装器,请参阅Implement a wrapper for inspectors and track item-level events in each inspector 了解更多信息。
    • 对不起。你能在代码中展示你如何使用它吗?我没有完全关注你。
    猜你喜欢
    • 2021-10-24
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 2016-09-08
    • 1970-01-01
    • 2021-10-28
    相关资源
    最近更新 更多