C# 是否正在Outlook加载项中消失“答复”、“全部答复”和“转发”事件处理程序?
我正在尝试从Outlook 2007中捕获事件,以便在“答复/全部答复/转发”窗口激活时加载项。所以我这样做:C# 是否正在Outlook加载项中消失“答复”、“全部答复”和“转发”事件处理程序?,c#,vsto,outlook-addin,office-addins,C#,Vsto,Outlook Addin,Office Addins,我正在尝试从Outlook 2007中捕获事件,以便在“答复/全部答复/转发”窗口激活时加载项。所以我这样做: private void ThisAddIn_Startup(object sender, System.EventArgs e) { this.Application.ItemLoad += new Microsoft.Office.Interop.Outlook.ApplicationEvents_11_ItemLoadEventHandler(onItemLoad); }
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");
}
这可以工作几次,但随后停止。在这种情况下,我仍然会收到onimload
事件,但是回复上的事件、回复上的事件和转发上的事件不再广播
我在这里做错了什么?您将单个对象定义为事件的源,如Reply
、ReplyAll
或Forward
。这意味着只能打开一个项目来处理这些事件。让我们想象一下以下场景:打开两个项目并触发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");
}
private void ThisAddIn\u启动(对象发送方,System.EventArgs e)
{
this.Application.ItemLoad+=新的Microsoft.Office.Interop.Outlook.ApplicationEvents\u 11\u ItemLoadEventHandler(onItemLoad);
}
List gObj_itevetlist=新列表();
专用无效加载(对象项)
{
ItemEvents\u 10\u Event gObj\u itemEvt=(Outlook.ItemEvents\u 10\u Event)项;
gObj_itemEvt.Reply+=新的Microsoft.Office.Interop.Outlook.ItemEvents_10_ReplyEventHandler(on_Reply);
gObj_itemEvt.ReplyAll+=新的Microsoft.Office.Interop.Outlook.ItemEvents_10_replyalventhandler(on_ReplyAll);
gObj_itemEvt.Forward+=新的Microsoft.Office.Interop.Outlook.ItemEvents_10_ForwardEventHandler(在_Forward上);
添加(gObj_itemEvt);
}
回复时的私有无效(对象项,参考bool取消)
{
//当用户加载回复窗口时调用
日志信息(“回复打开”);
}
回复上的私有无效(对象项,参考bool cancel)
{
//当用户加载“全部回复”窗口时调用
日志信息(“回复全部打开”);
}
转发时的私有无效(对象项,参考bool取消)
{
//当用户加载转发窗口时调用
日志信息(“向前打开”);
}
谢谢。我需要试试。但有一个问题——如果我一直收集列表中的所有对象,我不会有内存泄漏吗?换句话说,我是否需要在某个时候释放/删除它们?您可以订阅诸如卸载之类的事件,以便在需要时随时随地删除对象。它可以收集列表中的所有内容。但是为了修复内存泄漏,我如何知道在Unload
方法中卸载的是哪个对象,以便从gObj_itemEvtList
中删除它?要区分项目及其事件,您可以开发一个inspector包装,请参阅以获取更多信息。对不起。你能用代码说明你是如何使用它的吗?我没有完全明白你的意思。